回答
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
我找到了我的答案,请参阅我的回答 –