【问题标题】:Why this functional interface is valid [duplicate]为什么这个功能接口是有效的[重复]
【发布时间】:2020-10-08 10:41:45
【问题描述】:

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

【问题讨论】:

  • 只是一个捷径,(a,b)-&gt;a.c()ClassOfA::c是一回事
  • 阅读方法参考。

标签: java


【解决方案1】:

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

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

正如 Giorgi 所提到的,您应该参考 documentation on method references,因为这种语法还有很多内容,以及当 :: 之前的名称引用一个对象时它的工作方式类名。

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

  1. Class::staticMethod

    这相当于(a, b) -&gt; Class.staticMethod(a, b)

  2. object::method

    这相当于(a, b) -&gt; object.method(a, b)

  3. Class::method

    这相当于(a, b) -&gt; a.method(b)

  4. Class::new

    这相当于(a, b) -&gt; new Class(a, b)

【讨论】:

    猜你喜欢
    • 2021-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-19
    • 1970-01-01
    • 2019-09-08
    相关资源
    最近更新 更多