您不能在
input ->getValueProvider().apply(input).getValue()不更改语义的情况下用方法引用替换lambda 。
方法引用替换 单个 方法调用,因此它不能简单地替换包含多个方法调用的lambda表达式。
形式的lambda表达式
input ->getValueProvider().apply(input)可以被替换为,
getValueProvider()::apply当且仅当的评估时间
getValueProvider()无关紧要,因为在lambda形式中,在每个lambda主体评估中都调用该方法,而对于方法引用,仅调用一次,并且结果被抓
这类似于之间的区别
x ->System.out.println(x),并
System.out::println在那里读字段的内容
System.out在不同的时间发生,但通常并不重要。但是您应该意识到区别。
在您的示例中,
getValue()调用了第三个方法。用方法引用来表示的唯一方法是需要一个功能接口,例如like
Function,它具有诸如
andThenand / or 这样的方法
compose。但是,Java
8的工作方式要求将第一个方法引用转换为目标接口以调用合并方法,而这将很难理解您现在拥有的lambda表达式:类型
((Function<X,Y>)getValueProvider()::apply).andThen(Y::getValue)在哪里
Y,
apply(input)返回。
请注意,该规则说“ 在可能的情况下 用方法引用替换lambda ”,这使您有空间说“嗯,在这里是不可能的”,但是,我不确定您可以称其为“规则”多少……



