声纳 :将此 lambda 替换为方法引用

2022-09-01 08:40:55

此代码示例

Collection<Number> values = transform(
        getValuatedObjects(),
        input -> getValueProvider().apply(input).getValue());

违反了声纳库贝规则

Lambda 应替换为方法引用

它是声纳虫吗?或者我真的可以使用方法参考吗?


答案 1

如果不更改语义,则无法将 lambda 替换为方法引用。input -> getValueProvider().apply(input).getValue()

方法引用替换单个方法调用,因此它不能简单地替换由多个方法调用组成的 lambda 表达式。

当且仅当 的计算时间无关紧要时,该形式的 lambda 表达式可以替换为,因为在 lambda 形式中,在每个 lambda 主体计算中调用该方法,而对于方法引用,它仅被调用一次并捕获结果。input -> getValueProvider().apply(input)getValueProvider()::applygetValueProvider()

这类似于在不同时间读取字段内容之间的差异,但通常无关紧要。但你应该意识到其中的区别。x -> System.out.println(x)System.out::printlnSystem.out

在您的示例中,调用了第三个方法。使用方法引用来表示这一点的唯一方法需要一个功能接口,例如具有和/或等方法。但是,Java 8 的工作方式需要将第一个方法引用强制转换为目标接口以调用组合方法,这比您现在拥有的 lambda 表达式(where is the type)返回要容易得多。getValue()FunctionandThencompose((Function<X,Y>)getValueProvider()::apply).andThen(Y::getValue)Yapply(input)

请注意,该规则说“在可能的情况下用方法引用替换lambdas”,这给了你说“好吧,这是不可能的”的空间“,但是,我不确定你能把它称为”规则“多少......


答案 2

list.stream().sorted().collect(Collectors.toList()).forEach(element -> operate(element));

将上述 lambda 替换为方法引用。

list.stream().sorted().collect(Collectors.toList()).forEach(this::operation);


推荐