我正在学习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
答案 0 :(得分:8)
您要问的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)
匹配此功能接口,因为它具有StringBuilder
输入(调用它的实例)和String
输入。
StringBuilder reverse()
与此功能界面不匹配,因为它只有StringBuilder
输入而没有String
输入。