流的收集方法无法按预期工作

Collect method for streams doesn't work as expected

我正在测试流的 collect 方法。在此代码中,我试图通过在第一种情况下使用 StringBuilder 并在第二种情况下连接 String 来从字符串流构建单个字符串。我不明白为什么第二种情况会产生一个空字符串。

    String[] strs = new String[] {"aaaaa", "bbbbbbb", "c", "dd"};
    
    
    StringBuilder sb = Arrays.stream(strs).collect(StringBuilder::new, StringBuilder::append, StringBuilder::append);
    
    System.out.println(sb);
    
    
    String s = Arrays.stream(strs).collect(String::new, String::concat, String::concat);
    
    System.out.println(s);

嗯,它不起作用的原因是 String 是不可变的。

String::new 是一个 Supplier<String>,returns 是一个空的 String

而且你的累加器和组合器无法改变它,因为 String 是不可变的。

您的代码与以下代码具有相同的效果:

String s = new String ();
for (String str : strs) {
    s.concat(str);
}

concat 的调用产生新的 String,并且不影响结果的值 String

由于 String 是不可变的,您可以使用不可变缩减(即使用 reduce 而不是 collect):

String s = Arrays.stream(strs).reduce("",String::concat);

这与以下结果相同:

String s = "";
for (String str : strs) {
    s = s.concat(str);
}