Java 8方法引用-只能在使用者功能接口中使用吗

Java 8方法引用-只能在使用者功能接口中使用吗,java,java-8,Java,Java 8,我已经使用Java8方法引用很长一段时间了,但是我脑子里有这个问题 我知道方法引用是lambda表达式的简写符号,它调用单个方法(该方法可能是静态方法,也可能是属于实例对象的构造函数或方法) 这是否意味着,方法引用只能用作消费者功能接口lambda的替代品 比如说 Consumer<String> c = s -> System.out.println(s); 当然可以这样写,这几乎是同一件事。通过方法引用,您可以在内部保存一个或多个方法调用,通常是一个很小的方法,可以通过

我已经使用Java8方法引用很长一段时间了,但是我脑子里有这个问题

我知道方法引用是lambda表达式的简写符号,它调用单个方法(该方法可能是静态方法,也可能是属于实例对象的构造函数或方法)

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

比如说

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

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

在我看来,还有一件事是,在方法引用的情况下,它更具可读性

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

Function<String, Integer> f = String::length
Function<Object, String> toString = Object::toString;
Function<Object, String> valueOf = String::valueOf;
函数f=String::length
答案是肯定的(关于“这是一条捷径吗”)。您只能在传递lambda(确切地说,是该lambda的实际类型)的情况下使用方法引用。其思想是传递“一段代码”供以后执行。lambda是通用形式,允许您运行编写的任何代码

但特别是当它只是关于调用一个特定的方法时,为什么要强迫用户放下一个lambda

换句话说:方法引用是。它们没有任何附加功能来丰富Java。它们很简单,可以让你表达一个非常常见的情况,而不需要写下完整的lambda。确切地说:方法引用只是:lambdas的快捷方式

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

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

Function<String, Integer> f = String::length
Function<Object, String> toString = Object::toString;
Function<Object, String> valueOf = String::valueOf;
函数toString=Object::toString;
函数valueOf=String::valueOf;

当你说“只是语法上的糖”时,你通常会说“它是什么”。但是这也有点不正确,因为方法引用和lambda要多一些,例如匿名内部类捕获
这个
,即使没有使用,其他类也不会。此外,整个
的含义对于lambda也会发生变化。当然,一个匿名的内部类总是会产生一个新的实例,lambdas,可能不会。我最初的问题是,方法引用只能用作“消费者”类型函数接口的替代品吗?从其他答案中了解到,方法引用可以替代任何类型的lambda表达式。感谢您回答我的问题。这是否意味着方法引用只能用作消费者功能接口lambda的替代品?一点也不。你是怎么得出这个结论的?谢谢你的迅速复出。欢迎使用upvote rights,它为您提供了更多的方式来表达您的感激之情;-)
Function<Object, String> toString = Object::toString;
Function<Object, String> valueOf = String::valueOf;