2016-04-29 87 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("_"))。不過,你實際上沒有告訴我們你想要的結果。