Java 8方法引用是否只能在使用者功能接口中使用

时间:2018-08-19 07:57:32

标签: java java-8

我已经使用Java 8方法引用已有相当长的时间了,但是我心中有这个问题。

我知道方法引用是l​​ambda表达式的缩写,它调用一个方法(该方法可以是静态的,也可以是属于实例对象的构造函数或方法)。

这是否意味着方法引用只能用作消费者功能接口的lambda的替代品?

例如

Consumer<String> c = s -> System.out.println(s); 

可以改写为

 Consumer<String> c = System.out::println;

还有

Consumer<T> c=(args) -> Class.staticMethod(args)

可以写成

Class::staticMethod

3 个答案:

答案 0 :(得分:2)

当然可以这样写,这几乎是同一件事。有了方法参考,您将在内部保存另一个方法调用,通常这是一个很小的方法,可以通过JIT轻松内联。

IMO的另一件事是,在方法引用的情况下它更具可读性。

当然,您的最后一点是对,错。您可以编写例如:

Function<String, Integer> f = String::length

答案 1 :(得分:1)

  

这是否意味着方法引用只能用作消费者功能接口的lambda的替代品?

不。只要签名匹配,就可以使用方法引用代替任何lambda表达式。例如:

Function<Object, String> toString = Object::toString;
Function<Object, String> valueOf = String::valueOf;

答案 2 :(得分:0)

答案是肯定的(关于“是否快捷”)。您只能使用方法引用代替传递lambda(或更确切地说:该lambda的实际类型)。这个想法是您传递“一段代码”以供以后执行。 Lambda是通用形式,允许您运行您写下的任何代码。

但是特别是在仅调用特定方法时,为什么要强迫用户放下lambda?!

换句话说:方法引用是syntactic sugar。他们没有使用任何附加功能来丰富Java。它们简单易用,可让您表达一种非常普遍的情况,而无需写下完整的lambda。确切地说,方法引用就是:lambda的快捷方式。