我已经使用Java 8方法引用已有相当长的时间了,但是我心中有这个问题。
我知道方法引用是lambda表达式的缩写,它调用一个方法(该方法可以是静态的,也可以是属于实例对象的构造函数或方法)。
这是否意味着方法引用只能用作消费者功能接口的lambda的替代品?
例如
Consumer<String> c = s -> System.out.println(s);
可以改写为
Consumer<String> c = System.out::println;
还有
Consumer<T> c=(args) -> Class.staticMethod(args)
可以写成
Class::staticMethod
答案 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的快捷方式。