java - 构造函数引用和调用构造函数的 lambda 表达式有什么区别?

标签 java java-8 java-stream

我正在研究 Java 8 中的 Stream API,我遇到了一个问题。问题是我试图理解 ()->new StringBuilder 之间的差异和StringBuilder::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

最佳答案

您所询问的 lambda 表达式 ( ()->new StringBuilder() ) 和方法引用 ( StringBuilder::new ) 是等效的。使用您认为更具可读性的选项。

关于第二个问题:

考虑 collect 的签名:

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

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

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

关于java - 构造函数引用和调用构造函数的 lambda 表达式有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49388314/

相关文章:

java - 为什么java中需要非抽象类?

java - 将复杂对象传递给 Activity

javascript - 通过 WildFly 加载 JavaScript 文件

java - 为什么 Files.list() 并行流的执行速度比使用 Collection.parallelStream() 慢得多?

Java 8 Lambda 表达式 - 嵌套类中的多个方法怎么样

java - 我可以使用 Stream 将一个元素映射到多个元素吗?

java - Spring security - 限制对我的更新个人资料页面的访问

java - 如何将两个 java8 流操作(一个终端操作和一个惰性操作)组合成一个操作?

java - 如何获取 IntStream.map.forEach 的索引?

Peek 中的 Java 8 条件逻辑?