2016-04-29 15 views
2

私はreduceメソッドを理解しようとしています。私がstream()でreduceを使うと、_abが得られ、parallelStream()でreduceを使うと、​​が得られます。 parallelStreamとstreamのどちらを使用するかにかかわらずreduceの出力は同じではありませんか?java 8 parallelStreamとストリームで減らす

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値はアキュムレータ機能のIDでなければなりません。つまり、tの場合、accumulator.apply(identity, t)tになります。

これは、渡された入力には当てはまりません。 "_".concat(t)tと等しくありません。あなたが無効な引数を渡したので、メソッドの動作は未定義で、メソッドはmaking demons shoot out of your noseを含む何かを行うことができます。私はあなたが.collect(joining("_"))をしたい疑うのに

私は実際にあなたを振る舞いを伝える苦労を持っているが、欲しいです。あなたは実際に私たちにあなたの希望の出力を教えていない。

関連する問題