可以使用雙冒號兩次嗎?Java Lambda(雙冒號)
樣品我有3類
Class A {
String name;
B classB;
}
Class B {
String age;
C classC;
}
Class C {
String location;
}
我需要使用A::getClassB::getClassC::getLocation
這可能嗎?
可以使用雙冒號兩次嗎?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