gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 06:12:20 24 4
gpt4 key购买 nike

我正在研究 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com