Bas*_*khi 2 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");
Run Code Online (Sandbox Code Playgroud)
和
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");
Run Code Online (Sandbox Code Playgroud)
我何时应该使用第一种语法,何时应该选择第二种语法?
为什么上面的代码接受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);
Run Code Online (Sandbox Code Playgroud)
第二个参数是a,BiConsumer其第一个参数是collect操作输出的类型,第二个参数是Stream元素的类型.在你的情况下,你需要一个BiConsumer<StringBuilder,String>.StringBuilder append(String str)匹配此功能接口,因为它有一个StringBuilder输入(调用它的实例)和一个String输入.
StringBuilder reverse()与此功能接口不匹配,因为它只有StringBuilder输入而没有String输入.