我正在尝试理解reduce方法。如果我使用reduce with stream(),我得到_ab
,如果我使用reduce parallelStream()
,我得到_a_b
。不管我们使用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){ }
}
}
答案 0 :(得分:2)
如果您传递了有效的参数,那将是。阅读Javadoc:
identity
值必须是累加器函数的标识。这意味着,对于所有t
,accumulator.apply(identity, t)
等于t
。
您所通过的输入并非如此; "_".concat(t)
不等于t
。由于您传递了无效参数,因此该方法的行为未定义,并允许该方法执行任何操作,包括making demons shoot out of your nose。
我很难说出你实际想要的行为,尽管我怀疑你想要.collect(joining("_"))
。但是,你实际上并没有告诉我们你想要的输出。