当前位置: 首页 > 知识库问答 >
问题:

Sonar:用方法引用替换这个lambda。什么时候应该使用“stream()”?[重复]

陶原
2023-03-14

我想知道这两段代码有什么区别:

underlyingConnectors.values().stream().forEach(connector -> connector.start());

underlyingConnectors.values().forEach(connector -> connector.start());

underlyingConnectors.values().forEach(Connector::start);

第二行编译得很好,但我的 Ecplipse IDE 抱怨“声纳:用方法引用替换这个 lambda”。

如何选择要使用的适当代码?这些都有具体的用例吗?

共有3个答案

柯乐童
2023-03-14

如果你只是通过 .forEach() 对每个元素执行一个操作,则可以省略 .stream()。调用 .stream() 是多余的。

underlyingConnectors.values().stream().forEach(connector -> connector.start());
underlyingConnectors.values().forEach(connector -> connector.start());

第2行是正确的。

如果您只是对每个条目应用一个操作,那么只需使用方法引用,无需编写lambda。这基本上是一种速记。

underlyingConnectors.values().forEach(connector -> connector.start());
underlyingConnectors.values().forEach(Connector::start);

第2行是正确的。

贺宏富
2023-03-14

第一行包含对stream()的不必要调用,后面的两个是见仁见智的问题。如果您想编写最短、最简洁的代码,您可以使用最后一个。所有这些都以等效的方式工作,主要是关于样式。

stream()是不必要的,因为values()返回一个Collection,它扩展了具有forEach(Consumer

文增
2023-03-14

第二个简单地是第一个的速记符号,第三个是第二个的速记符号。经验法则是,如果一个方法没有像第二个一样的参数,你可以简单地用像第三个一样的符号替换它。

更一般地说,如果lambda表达式右侧(RHS)的表达式是lambda表达式左侧(LHS)的方法调用,不需要额外的参数,或者是只接受表达式左侧作为参数的方法调用,那么lambda表达式可以替换为方法引用-一旦RHS接受两个参数,它就不像Java那样“漂亮”,目前不支持方法的柯里化作为语言特性,但可以替换为包装器:

package com.example;

import java.util.Arrays;
import java.util.List;
import java.util.function.Consumer;

public class Application {

  private static final String LINEBREAK = System.lineSeparator();

  public static void main(String[] args) {
    final List<String> strings = Arrays.asList("Hello", "World", "!");

    strings.forEach(string -> System.out.print(string + LINEBREAK)); // 1

    strings.forEach(string -> Application.printWithLineBreakParameter(LINEBREAK).accept(string)); // 2

    strings.forEach(Application.printWithLineBreakParameter(LINEBREAK)); // 3
  }

  private static Consumer<String> printWithLineBreakParameter(final String lineBreak) {
    return (string) -> System.out.print(string + lineBreak);
  }
}

这里,所有三个调用都是相等的,但是2可以用3代替,这样看起来比1更简洁。

 类似资料:
  • 当我在sonar中检查时,结果是: 它实际上指的是: 我的代码如下所示: 我试图改变它,但我得到了一个错误。有人知道如何改变它吗?

  • 索纳尔曲贝的解释是: 方法/构造函数引用比使用lambdas更紧凑、更易读,因此是首选。

  • 问题内容: 最近,我在WeakReferences中遇到了一段Java代码- 尽管在引入它们时会遇到它们,但我从未见过部署它们。这是应该常规使用的还是仅在遇到内存问题时才使用的东西?如果是后者,是否可以轻松地对其进行改造,或者代码需要进行认真的重构?一般的Java(或C#)程序员通常可以忽略它们吗? 编辑 过度热情地使用WR会造成任何损害吗? 问题答案: 弱引用都是关于垃圾回收的。一个 标准的 对

  • 问题内容: 我知道他们两个都禁用了Nagle的算法。 我什么时候应该/不应该使用它们中的每一个? 问题答案: 首先,不是所有人都禁用Nagle的算法。 Nagle的算法用于减少有线中更多的小型网络数据包。该算法是:如果数据小于限制(通常是MSS),请等待直到收到先前发送的数据包的ACK,同时累积用户的数据。然后发送累积的数据。 这将对telnet等应用程序有所帮​​助。但是,在发送流数据时,等待A

  • 问题内容: 在该类中,有两个字符串,和。 有什么不同?我什么时候应该使用另一个? 问题答案: 如果你的意思是和则: 用于在文件路径列表中分隔各个文件路径。考虑在上的环境变量。您使用a分隔文件路径,因此在上将是;。 是或用于拆分到特定文件的路径。例如在上,或

  • 问题内容: 代替在所有地方使用是否合法?为什么从Python 3中删除?似乎是一种了不起的,有用的方法。它背后的原因是什么? 编辑: 为澄清起见,我想知道以类似于生成器的方式(一次将一项,而不是全部都存储到内存中)以与Python 2和Python 3兼容的方式遍历字典的正确习惯是什么。 ? 问题答案: 在Python 2.x中-返回(键,值)对的列表。在Python 3.x中,现在是一个对象,其