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