首页 > 解决方案 > 为什么这个功能接口是有效的

问题描述

我找到了一个带有 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) 只有一个参数。String 类没有
boolean startWith(String srt1, String srt2) 方法。

标签: java

解决方案


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

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

正如 Giorgi 所提到的,您应该查阅有关方法引用的文档,因为这种语法还有很多内容,以及当之前的名称::引用对象不是类名时它的工作方式。

简而言之,有四种情况。假设具有两个参数a和的方法调用的功能接口b

  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).


推荐阅读