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) 只有一个参数。String 类没有
boolean startWith(String srt1, String srt2) 方法。
解决方案
方法 startWith(String str) 只有一个参数。
实际上String.startsWith
有一个隐式this
参数,因为您在对象实例上调用它。因此它符合具有两个String
参数的功能接口。
正如 Giorgi 所提到的,您应该查阅有关方法引用的文档,因为这种语法还有很多内容,以及当之前的名称::
引用对象而不是类名时它的工作方式。
简而言之,有四种情况。假设具有两个参数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)
.
推荐阅读
- jquery - 在 Jquery 中使用不使用 html 的变量动态创建表
- c# - Office.Interop.Excel C#如何打开excel文件的流或base64
- ckeditor - 方程图像添加到两个编辑器,而不是单页中的一个 ckeditor
- javascript - 什么可能导致 socket.io 的服务时间很长?
- html - 将 div 移动到下一行
- c++ - 在 C++17 中计算具有 POD 类型的普通数组的字段?
- python-3.x - 没有名为“samlib”的模块
- mongodb - Mongodb查询一个字段依赖于另一个字段
- vue.js - @submit 不触发方法 vue/quasar
- kotlin - Retrofit 什么时候会像 Rx 一样正式添加对协程的调用适配器工厂支持?