我创建了简单的演示:
public static void main(String[] args) {
List<String> list2 = Arrays.asList("adf", "bcd", "abc", "hgr", "jyt", "edr", "biu");
String collect = list2.stream().collect(String::new, (res, elem) -> {
res=res.concat(" ").concat(elem);
// System.out.printf("res=%s, elem=%s\n", res.isEmpty(), elem);
}, (res1, res2) -> {
System.out.printf("res1=%s, res2=%s\n", res1, res2);
});
System.out.println("collect=" + collect);
}
问题是BiConsumer combiner
的{{1}}部分根本没有运行。
如果我使用collect
,则会运行,但两个参数parallelStream()
和res1
等于供应商res2
。
如何String::new
使用combiner
方法?
答案 0 :(得分:18)
首先,没有必要在非并行流中执行组合器,因为没有任何东西可以组合。
其次,您的问题源于使用String::new
和String.concat
。累加器应该通过将第二个参数与它组合来修改第一个参数,但由于Java中的字符串是不可变的,因此您的代码不会产生任何内容。
res=res.concat(" ").concat(elem);
将创建一个新字符串然后扔掉它。您希望使用StringBuilder,以便保留中间结果:
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\n", res1, res2);
}).toString();
System.out.println("collect=" + collect);
}
这也适用于并行流
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
答案 1 :(得分:8)
我认为combiner
仅用于并行Streams(用于组合并行计算的部分输出),因此请使您的Stream并行。
String collect = list2.parallelStream().collect(...
答案 2 :(得分:3)
对于Raniz样本,有和没有并行的结果更有趣:
String collect = list2.stream().collect(StringBuilder::new,
(res, elem) -> {
System.out.printf("ACCUMULATE res=%s, elem=%s\n", res, elem);
res.append(" ").append(elem);
},
(res1, res2) -> {
System.out.printf("COMBINE res1=%s, res2=%s\n", res1, res2);
res1.append(res2.toString());
}).toString();
没有并行组合永远不会被调用:
ACCUMULATE res=, elem=adf
ACCUMULATE res= adf, elem=bcd
ACCUMULATE res= adf bcd, elem=abc
ACCUMULATE res= adf bcd abc, elem=hgr
ACCUMULATE res= adf bcd abc hgr, elem=jyt
ACCUMULATE res= adf bcd abc hgr jyt, elem=edr
ACCUMULATE res= adf bcd abc hgr jyt edr, elem=biu
collect= adf bcd abc hgr jyt edr biu
与并行
ACCUMULATE res=, elem=jyt
ACCUMULATE res=, elem=hgr
COMBINE res1= hgr, res2= jyt
ACCUMULATE res=, elem=biu
ACCUMULATE res=, elem=edr
COMBINE res1= edr, res2= biu
ACCUMULATE res=, elem=bcd
COMBINE res1= hgr jyt, res2= edr biu
ACCUMULATE res=, elem=abc
ACCUMULATE res=, elem=adf
COMBINE res1= bcd, res2= abc
COMBINE res1= adf, res2= bcd abc
COMBINE res1= adf bcd abc, res2= hgr jyt edr biu
collect= adf bcd abc hgr jyt edr biu