使用parallelStream和stream减少java 8

时间:2016-04-29 20:42:02

标签: java parallel-processing java-stream reduce

我正在尝试理解reduce方法。如果我使用reduce with stream(),我得到_ab,如果我使用reduce parallelStream(),我得到_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 个答案:

答案 0 :(得分:2)

如果您传递了有效的参数,那将是。阅读Javadoc

  

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

您所通过的输入并非如此; "_".concat(t)不等于t。由于您传递了无效参数,因此该方法的行为未定义,并允许该方法执行任何操作,包括making demons shoot out of your nose

我很难说出你实际想要的行为,尽管我怀疑你想要.collect(joining("_"))。但是,你实际上并没有告诉我们你想要的输出。