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

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

Era*_*ran 8

您询问的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输入.