使用下面的代码,我总是得到0作为第一个输出。这有保证吗?Java Stream'peek'是在终端操作之前还是之后发生?
import java.util.Random;
import java.util.stream.Stream;
public class Main {
public static void main(String[] args) {
Main m = new Main();
m.rope();
}
class Wrapper {
public int x = 0;
}
void rope() {
Stream.generate(Wrapper::new).limit(100000)
.peek(w -> asum += w.x)
.forEach(w -> mutate(w));
System.out.println(asum);
System.out.println(bsum);
}
void mutate(Wrapper w) {
w.x = r.nextInt(2);
bsum += w.x;
}
protected long asum = 0;
protected long bsum = 0;
Random r = new Random(0);
}
根据“偷看”的文件“...... 为元素消耗每个元素执行所提供的行动......”。但对于非平行流,它必须在之前或之后。
换言之,当“终端操作”发生了一个元件被它从终端操作之前或之后的管道删除?
(我敢肯定,“前”是正确的答案,而是试图理解一些复杂的流代码,其中相反似乎假设。)
切圆,其接受一个函数的流操作的所有指定的功能应该是[非干扰(https://docs.oracle.com/javase/8/docs/api/java/util/stream/package -summary.html#互不干扰)。这意味着,在界面层面,如果发现未知的情况,可以安全地离开。 –