【问题标题】:What is the difference between a constructor reference and a lambda expression that invokes a constructor? [closed]构造函数引用和调用构造函数的 lambda 表达式有什么区别? [关闭]
【发布时间】:2018-03-20 15:33:01
【问题描述】:

我正在研究 Java 8 中的 Stream API,但遇到了一个问题。问题是我试图在以下代码中了解()->new StringBuilderStringBuilder::new 之间的区别:

Stream<String> stream = Stream.of(new String[]{"b", "a", "s", "i", "l",});
StringBuilder basil = stream.collect(StringBuilder::new, StringBuilder::append, StringBuilder::append);
System.out.println("basil");

Stream<String> stream = Stream.of(new String[]{"b", "a", "s", "i", "l",});
    StringBuilder basil = stream.collect(()->new StringBuilder(), StringBuilder::append, StringBuilder::append);
    System.out.println("basil");

什么时候应该使用第一种语法,什么时候应该选择第二种?

以及为什么上面的代码接受StringBuilder::append而不接受StringBuilder::reverse

【问题讨论】:

  • 它们在功能上是等效的。第二个称为'method reference'
  • 两者是等价的。如果可能的话,我建议使用方法引用,因为它更紧凑并且在我看来更具可读性。这是基于意见的。
  • @Zabuza 它并不总是更紧凑。当写成方法引用时,私有静态方法通常更冗长。
  • 是的,选择你认为在特定情况下更具可读性和适当性的任何内容。
  • 它主要是“相同”的东西,如果你真的在乎,方法引用将创建一个更少的合成方法

标签: java java-8 java-stream


【解决方案1】:

您询问的 lambda 表达式 (()-&gt;new StringBuilder()) 和方法引用 (StringBuilder::new) 是等效的。使用对您来说更具可读性的那个。

关于第二个问题:

考虑collect的签名:

<R> R collect(Supplier<R> supplier,
              BiConsumer<R, ? super T> accumulator,
              BiConsumer<R, R> combiner);

第二个参数是BiConsumer,其第一个参数是collect操作的输出类型,第二个参数是Stream元素的类型。在您的情况下,您需要一个BiConsumer&lt;StringBuilder,String&gt;StringBuilder append(String str) 匹配这个功能接口,因为它有一个StringBuilder 输入(调用它的实例)和一个String 输入。

StringBuilder reverse() 与此功能接口不匹配,因为它只有StringBuilder 输入,没有String 输入。

【讨论】:

  • 如何将一些变量传递给方法引用?
  • @BasilBattikhi 在提出后续问题之前,请实际上do some research yourself
  • @Eran 谢谢你回答我。我确实有点困惑,我不知道如何搜索它们
  • @Eran 是的,实际上它在你的回答之前很抱歉
  • @Eran 我将问题作为原始问题回滚,谢谢您的帮助
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-23
  • 1970-01-01
  • 1970-01-01
  • 2019-08-30
  • 1970-01-01
  • 2021-07-04
相关资源
最近更新 更多