2016-04-29 138 views
2

我想了解reduce方法。如果我使用流()减少我得到_ab,如果我使用减少与parallelStream()我得到​​。无论我们使用parallelStream还是stream,reduce的输出不应该相同吗?java 8用parallelStream和stream减少

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){ } 
    } 
} 

回答

2

这将是,如果你已经通过了有效的论证。阅读Javadoc

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

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

我很难告诉你实际上想要的行为,虽然我怀疑你想要.collect(joining("_"))。不过,你实际上没有告诉我们你想要的结果。