Java Lambda(双冒号)
问题描述:
可以使用双冒号两次吗?Java Lambda(双冒号)
样品我有3类
Class A {
String name;
B classB;
}
Class B {
String age;
C classC;
}
Class C {
String location;
}
我需要使用A::getClassB::getClassC::getLocation
这可能吗?
答
我需要使用
A::getClassB::getClassC::getLocation
这可能吗?
不是这样的。
您正在讨论方法引用语法,它通过名称,名称,类型或其所属的类或接口的实例来指定方法。根据Java Tutorial,恰好有四种形式他们可以采取:
- 引用一个静态方法:
ContainingClass::staticMethodName
- 参考特定对象的实例方法:
containingObject::instanceMethodName
- 参考的一个实例方法特定类型的任意物体:
ContainingType::methodName
- 参考构造:
ClassName::new
类型和变量名称不能包含冒号,因此只有那些可以设想链接冒号的变量名称是(2),然后您将在那里形成对lambda方法的引用。这看起来并不是你想要做的。
如果你的课程实际上有getter方法,如你似乎要使用,那么你应该能够编写类似的表达拉姆达:
a -> a.getClassB().getClassC().getLocation()
另外,你应该能够写这种形式的方法参考:
myA.getClassB().getClassC()::getLocation
那些具有不同的意义,如本实施例中的代码演示:
import java.util.function.Function;
import java.util.function.Supplier;
public class X {
// Note the types declared for these objects:
Function<A, String> f1 = a -> a.getClassB().getClassC().getLocation();
Supplier<String> f2 = new A().getClassB().getClassC()::getLocation;
}
class A {
String name;
B classB = new B();
public B getClassB() { return classB; }
}
class B {
String age;
C classC = new C();
public C getClassC() { return classC; }
}
class C {
String location;
public String getLocation() { return location; }
}
特别
注意a -> a.getClassB().getClassC().getLocation()
在于,计算在给定作为输入A
一个位置字符串的λ,而myA.getClassB().getClassC()::getLocation
是通过调用myA.getClassB().getClassC()
(在该点处获得的特定C
的getLocation()
方法的引用,其中所述方法参考被实例化,而不是它被使用的地方)。我怀疑其中之一就是你真正想要的。
为什么你不试试 – Jens
只有当你将'B','C'和'location'声明为'static'并且相应的方法是静态的时,才应该可能。 '::'用于静态 – ACV
@ACV方法引用只能引用'static'方法是不正确的。 – Jesper