英文:
Why this functional interface is valid
问题
我找到了一个使用 Java Predicate 函数式接口的示例:
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) 方法。
英文:
I have found an example with java predicate functional interface:
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"));
I understand how b2 works - it's clear.
How does the compiler understand how to use the b1 method? Method boolean startWith(String str) has only one parameter. String class doesn't have
boolean startWith(String srt1, String srt2) method.
答案1
得分: 5
> 方法 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)
。
英文:
> Method startWith(String str) has only one parameter.
Actually String.startsWith
has an implicit this
parameter because you’re calling it on an object instance. Thus it conforms to a functional interface with two String
parameters.
As mentioned by Giorgi, you should consult the documentation on method references, since there’s a lot more to this syntax, and the way it works when the name before ::
refers to an object versus a class name.
Briefly, there are four cases. Assuming a functional interface for a method call with two parameters a
and b
:
-
Class::staticMethod
This is equivalent to
(a, b) -> Class.staticMethod(a, b)
. -
object::method
This is equivalent to
(a, b) -> object.method(a, b)
. -
Class::method
This is equivalent to
(a, b) -> a.method(b)
. -
Class::new
This is equivalent to
(a, b) -> new Class(a, b)
.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论