First off, there is no need for the combiner to be executed in a non-parallel stream since there is nothing to combine.
Secondly, your issue stems from using String::new
and String.concat
. The accumulator is supposed to modify the first argument by combining the second argument with it but since strings in Java are immutable your code will produce nothing.
res=res.concat(" ").concat(elem);
will create a new string and then throw away it. You want to use a StringBuilder instead so you can keep the intermediate results:
public static void main(String[] args) {
List<String> list2 = Arrays.asList("adf", "bcd", "abc", "hgr", "jyt", "edr", "biu");
String collect = list2.stream().collect(StringBuilder::new, (res, elem) -> {
res.append(" ").append(elem);
}, (res1, res2) -> {
res1.append(res2.toString());
System.out.printf("res1=%s, res2=%s
", res1, res2);
}).toString();
System.out.println("collect=" + collect);
}
This will also work correctly with a parallel stream
res1= hgr jyt, res2= jyt
res1= bcd abc, res2= abc
res1= adf bcd abc, res2= bcd abc
res1= edr biu, res2= biu
res1= hgr jyt edr biu, res2= edr biu
res1= adf bcd abc hgr jyt edr biu, res2= hgr jyt edr biu
collect= adf bcd abc hgr jyt edr biu
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…