我们说Predicate
和Function
- 界面:
Function<String, String> function = null;
Predicate<String> predicate = null;
现在我想给Predicate
- 接口一个方法引用,其中返回类型是boolean
,在我们的例子中,参数是一个字符串。但为什么以下方法参考似乎是正确的:
Predicate<String> predicate = String::isEmpty;
isEmpty
- 方法没有String-Parameter,尽管Predicate
- Interface需要String-Parameter。为什么它仍然是对的?我错过了什么吗?
另一个例子:在我们的例子中,Function接口返回一个String并将String作为参数。但以下方法参考似乎是错误的:
Function<String, String> function = String::concat; //wrong
Concat-Method有一个String作为参数并返回一个String。为什么错呢?
希望有人可以向我解释。
答案 0 :(得分:3)
在实例方法上使用方法引用时,方法接收器成为第一个参数。所以
String::isEmpty
相当于
(String str) -> str.isEmpty()
和
String::concat
相当于
(String a, String b) -> a.concat(b)
...与Function
的类型不匹配。
答案 1 :(得分:0)
原因
Function<String, String> function = String::concat;
不编译是因为它等同于(如路易写的)
Function<String, String> function = (String a, String b) -> a.concat(b);
虽然Function.apply(T t)
只接受一个参数(t
),但您传递的函数带有两个参数(a
和b
)。
答案 2 :(得分:0)
element.NavigableString
可能意味着两件事之一。
String类中的静态方法:
String::isEmpty
String类中的实例方法:
s -> String.isEmpty(s)
您的案件属于#2。
同样,(String s) -> s.isEmpty()
可能意味着两件事之一:
String::concat
或
(s1, s2) -> String.concat(s1, s2)
(但是,这不是 (String s1, String s2) -> s1.concat(s2) // Your case
,因为它不只是一个参数。但是,它是Function<String, String>
。)