Java 8:不了解Java实现功能接口的方式

时间:2017-03-18 22:23:59

标签: java methods lambda method-reference

我们说PredicateFunction - 界面:

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。为什么错呢?

希望有人可以向我解释。

3 个答案:

答案 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),但您传递的函数带有两个参数(ab)。

答案 2 :(得分:0)

理论上,

element.NavigableString可能意味着两件事之一。

  1. String类中的静态方法:

    String::isEmpty
  2. String类中的实例方法:

    s -> String.isEmpty(s)
    
  3. 您的案件属于#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>。)