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

我正在测试collect流的方法。在这段代码中,我试图通过StringBuilder在第一种情况下使用 a并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>返回空的String.

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

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

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

concat生成 newString的调用不会影响 result 的值String

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

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

这将产生与以下相同的结果:

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


以上是流的收集方法无法按预期工作的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>