为什么此功能界面有效

时间:2020-10-08 10:41:45

标签: java

我发现了一个带有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)方法。

1 个答案:

答案 0 :(得分:5)

startWith(String str)方法只有一个参数。

实际上String.startsWith有一个隐式this参数,因为您是在对象实例上调用它的。因此,它符合带有两个String参数的功能接口。

正如Giorgi所提到的,您应该查阅documentation on method references,因为此语法还有很多其他内容,并且::之前的名称引用对象 versus < / em>类名。

简而言之,有四种情况。假定具有两个参数ab的方法调用的功能接口:

  1. Class::staticMethod

    这等效于(a, b) -> Class.staticMethod(a, b)

  2. object::method

    这等效于(a, b) -> object.method(a, b)

  3. Class::method

    这等效于(a, b) -> a.method(b)

  4. Class::new

    这等效于(a, b) -> new Class(a, b)