使用下面的代碼,我總是得到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#互不干擾)。這意味着,在界面層面,如果發現未知的情況,可以安全地離開。 –