回答
String::startWith
將startWith()
方法應用於lambda的第一個參數。
""::startWith
施加startWith()
方法所涉及的""
字面或到未聲明爲的λ參數的變量的更廣泛的方式。
爲了更詳盡,提供方法參考的這兩種方法是不可替代的。
假設您想對public boolean startsWith(String prefix)
方法使用方法參考。
我將其指定爲方法過載。
使用的λ參數的方法,參考被設計而使用的λ參數未聲明的變量的方法參考設計有Predicate<String>
功能接口工作,並具一個BiPredicate<String, String>
功能接口工作。
與作爲該方法引用的目標通過一個可變的方式:
String myVariable; myVariable::startWith
已經提供應在其上應用該方法的參考字符串。這裏:myVariable
。
所以,只有前綴參數需要在lambda中傳遞。
因此Predicate<String>
西裝。
使用拉姆達參數的第一個參數作爲該方法引用的目標的方式:
String::startsWith
不提供字符串在其上的方法應該參考應用。
所以,方法應該被調用的字符串和前綴參數都需要在lambda中傳遞。
因此BiPredicate<String, String>
適合。
下面是一個示例代碼來說明:
public static void main(String[] args) {
// using method reference with lambda parameter
myMethodWithBiPredicate((s, prefix) -> s.startsWith(prefix), "mystring", "my");
myMethodWithBiPredicate(String::startsWith, "mystring", "my");
// using method reference with variable not in lambda parameter
String stringNotInLambdaParams = "stringNotInParam";
Predicate<String> functionPredicate = stringNotInLambdaParams::startsWith;
System.out.print("myMethodWithBiPredicate with string "
+ "(included in the method reference)="
+ stringNotInLambdaParams
+ " and prefix= string | Result = ");
myMethodWithPredicate(functionPredicate, "string");
}
public static void myMethodWithBiPredicate(BiPredicate<String, String> function,
String string,
String prefix) {
System.out.println("myMethodWithBiPredicate with string="
+ string + " and prefix= " + prefix
+ " | Result = " + function.test(string, prefix));
}
public static void myMethodWithPredicate(Predicate<String> function, String prefix) {
System.out.println(function.test(prefix));
}
產生以下輸出:
myMethodWithBiPredicate與字符串= MyString中和前綴=我的|結果 = true
myMethodWithBiPredicate with string = mystring and prefix = my |結果 = true
myMethodWithPredicate with string(包含在方法 參考中)= stringNotInParam和prefix = string |結果= true
設計師使用該語法有多麼奇怪。無論如何感謝解釋。 –
@Aluan Haddad:我在這裏看不到任何混亂。 'object :: method'將在'object'上調用'method'。 'Class :: method'沒有對象,因此,如果'method'不是'static',目標對象就成爲第一個函數參數。換句話說,'String :: startsWith'等價於'(a,b) - > a.startsWith(b)'和'「」:: startsWith'等價於'b - >「」.startsWith(b) '(相當於'b - > b.isEmpty()') – Holger
我對此感到困惑的是,使用'::'來解析靜態和實例成員,在兩種情況下都避開'.'。從C++的角度來看,'::'會解析一個靜態成員,'.'會解析一個實例成員。從C#POV中,'.'也可以解決。當然,我們不是在談論C++或C#,但在我看來,這是一個奇怪的選擇。 –
- 1. 分配拉姆達
- 2. 檢測拉姆達是否是這樣的方法參考
- 3. 異步參考拉姆達崩潰
- 4. 分配方法斯卡拉
- 5. 差分包裹時右值參考拉姆達
- 6. 爲什麼這種方法拉姆達的參數,它是如何工作的
- 7. 分組拉姆達
- 8. Python的拉姆達參數
- 9. C#拉姆達接口分配
- 10. aiohttp拉姆達在loop.start_server()方法
- 11. 返回拉姆達拍攝功能參數參考
- 12. 無法解決拉姆達參數
- 13. 揭開拉姆達如何工作
- 14. 拉姆達的普通類型和功能可供參考
- 15. 通用拉姆達方法簽名
- 16. 哈斯克爾嵌套讓拉姆達
- 17. C++ 11拉姆達捕獲列表[=]使用參考
- 18. 斯卡拉參考平等
- 19. RSpec - 拉姆達用法
- 20. 分配在沃爾弗拉姆的Mathematica
- 21. 斯卡拉方法參數
- 22. 與匹配拉姆達匹配的方案模式
- 23. C#拉姆達
- 24. 由拉姆達
- 25. 與拉姆達
- 26. 獲取拉姆達(的NodeJS)URL參數
- 27. Python的拉姆達在lambda
- 28. 分解一個OpenERP的拉姆達
- 29. 參考分配
- 30. 測試拉姆達平等的最有效方法表達式
我剛剛在你最近的評論中回答說,你最近的評論在你之前的問題中提出了同樣的問題。 – Eran
我找到了我的答案,請參閱我的回答 –