流的收集方法无法按预期工作
我正在测试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);
}