Java 8使用parallelStream和Stream进行reduce

6

我正在尝试理解reduce方法。如果我使用stream()和reduce一起使用,那么我会得到_ab,但是如果我使用parallelStream()和reduce一起使用,我会得到_a_b。难道不应该无论我们使用parallelStream还是stream,reduce的输出都应该是相同的吗?

import java.util.*;
import java.util.stream.*;

class TestParallelStream{

    public static void main(String args[]){
        List<String> l = Arrays.asList("a","b","c","d");
        String join=l.stream()
                     .peek(TestParallelStream::sleepFor)    
                     .reduce("_",(a,b) -> a.concat(b));
        System.out.println(join);
    }

    public static void sleepFor(String w){
        System.out.println("inside thread:"+w);
        try{
            Thread.currentThread().sleep(5000);
        }catch(InterruptedException e){ }
    }
}
1个回答

4
如果您传递了有效的参数,那就好办了。请参阅Javadoc

identity值必须是累加器函数的身份标识。这意味着对于所有的 taccumulator.apply(identity, t)等于t

而您所传递的输入参数并不满足此条件;"_".concat(t) 不等于 t。由于您传递了无效的参数,该方法的行为是未定义的,可能会执行任何操作,包括使恶魔从鼻子里冒出来
我很难确定您实际想要的行为,但我猜您想使用.collect(joining("_"))。虽然您没有告诉我们您想要什么输出结果。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接