Java 为什么此功能接口有效

Java 为什么此功能接口有效,java,Java,我发现了一个java谓词函数接口示例: BiPredicate<String, String> b1 = String::startsWith; BiPredicate<String, String> b2 = (string, prefix) -> string.startsWith(prefix); System.out.println(b1.test("chicken", "chick")); S

我发现了一个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"));
BiPredicate b1=String::startsWith;
双预测b2=
(字符串,前缀)->string.startsWith(前缀);
系统输出打印(b1.测试(“鸡”、“鸡”));
系统输出打印(b2测试(“鸡”、“鸡”);
我了解b2的工作原理-这很清楚。 编译器如何理解如何使用b1方法?方法boolean startWith(String str)只有一个参数。字符串类没有
布尔startWith(stringsrt1,stringsrt2)方法

方法startWith(字符串str)只有一个参数

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

正如Giorgi所提到的,您应该参考,因为这种语法还有很多内容,以及
之前的名称引用对象而不是类名时的工作方式

简而言之,有四个案例。假设方法调用的函数接口具有两个参数
a
b

  • Class::staticMethod

    这相当于
    (a,b)->Class.staticMethod(a,b)

  • 对象::方法

    这相当于
    (a,b)->object.method(a,b)

  • 类::方法

    这相当于
    (a,b)->a.方法(b)

  • Class::new

    这相当于
    (a,b)->新的类(a,b)


  • 这只是一个快捷方式,
    (a,b)->a.c()
    classa::c
    阅读方法引用是一样的。