此代码示例
Collection<Number> values = transform(
getValuatedObjects(),
input -> getValueProvider().apply(input).getValue());
违反了 Sonarqube 规则:
Lambda 应替换为方法引用
这是声纳错误吗?或者我真的可以使用方法参考吗?
原文由 gontard 发布,翻译遵循 CC BY-SA 4.0 许可协议
此代码示例
Collection<Number> values = transform(
getValuatedObjects(),
input -> getValueProvider().apply(input).getValue());
违反了 Sonarqube 规则:
Lambda 应替换为方法引用
这是声纳错误吗?或者我真的可以使用方法参考吗?
原文由 gontard 发布,翻译遵循 CC BY-SA 4.0 许可协议
list.stream().sorted().collect(Collectors.toList()).forEach(元素 -> 操作(元素));
用方法引用替换上面的 lambda。
list.stream().sorted().collect(Collectors.toList()).forEach(this::operate);
原文由 Akanksha gore 发布,翻译遵循 CC BY-SA 4.0 许可协议
15 回答8.4k 阅读
8 回答6.2k 阅读
1 回答4k 阅读✓ 已解决
3 回答6k 阅读
3 回答2.2k 阅读✓ 已解决
2 回答3.1k 阅读
2 回答3.8k 阅读
您不能在不更改语义的情况下将 lambda
input -> getValueProvider().apply(input).getValue()
替换为方法引用。一个方法引用替代了 单个 方法调用,因此它不能简单地替代由多个方法调用组成的 lambda 表达式。
形式为
input -> getValueProvider().apply(input)
的 lambda 表达式可以替换为getValueProvider()::apply
当且仅当getValueProvider()
的计算时间与 lambda 形式无关紧要 –方法在每个 lambda 主体评估中被调用,而对于方法引用,它只被调用一次并捕获结果。这类似于
x -> System.out.println(x)
和System.out::println
之间的区别,其中读取字段的内容System.out
它通常发生在不同的时间。但是你应该意识到其中的区别。在您的示例中,调用了第三种方法
getValue()
。用方法引用来表达这一点的唯一方法需要一个像Function
这样的功能接口,它有像andThen
和/或compose
这样的方法。但是,Java 8 的工作方式需要将第一个方法引用强制转换为目标接口以调用组合方法,这绝对比您现在拥有的 lambda 表达式更容易阅读:((Function<X,Y>)getValueProvider()::apply).andThen(Y::getValue)
其中Y
是类型,apply(input)
返回。请注意,规则说“ 尽可能 用方法引用替换 lambda”,这让您有余地说,“好吧,这里是不可能的”,但是,我不确定您可以在多大程度上称其为“规则”……