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