我发现了一个带有Java谓词功能接口的示例:
BiPredicate<String, String> b1 = String::startsWith;
BiPredicate<String, String> b2 =
(string, prefix) -> string.startsWith(prefix);
System.out.println(b1.test("chicken", "chick"));
System.out.println(b2.test("chicken", "chick"));
我了解b2的工作原理-很明显。
编译器如何理解如何使用b1方法?方法boolean startWith(String str)只有一个参数。字符串类没有
boolean startWith(String srt1,String srt2)方法。
答案 0 :(得分:5)
startWith(String str)方法只有一个参数。
实际上String.startsWith
有一个隐式this
参数,因为您是在对象实例上调用它的。因此,它符合带有两个String
参数的功能接口。
正如Giorgi所提到的,您应该查阅documentation on method references,因为此语法还有很多其他内容,并且::
之前的名称引用对象 versus < / em>类名。
简而言之,有四种情况。假定具有两个参数a
和b
的方法调用的功能接口:
Class::staticMethod
这等效于(a, b) -> Class.staticMethod(a, b)
。
object::method
这等效于(a, b) -> object.method(a, b)
。
Class::method
这等效于(a, b) -> a.method(b)
。
Class::new
这等效于(a, b) -> new Class(a, b)
。