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

时间:2018-03-20 15:33:02

标签: java java-8 java-stream

我正在学习Java 8中的Stream API,而我正面临着一个问题。问题是我试图理解以下代码中()->new StringBuilderStringBuilder::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

1 个答案:

答案 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输入。