我嘗試將Java Streams的某些工作並行化。讓我們看看這個簡單的例子:Java Stream generator爲什麼無序?
Stream.generate(new Supplier<Integer>() {
@Override
public Integer get() {
return generateNewInteger();
}
})
.parallel()
.forEachOrdered(new Consumer<Integer>() {
@Override
public void accept(Integer integer) {
System.out.println(integer);
}
});
的問題是,它不叫accept
方法forEachOrdered
,但如果我使用forEach
纔有效。我想問題是Stream.generate
內部創建InfiniteSupplyingSpliterator
沒有ORDERED
特徵。
問題是爲什麼?我們似乎知道數據生成的順序。第二個問題是如何在並行流上執行forEachOrdered
並生成流元素?
它是無序的,因爲規範說明了這一點。它沒有完成的原因是它是*無限*,結合實現細節。 – Holger
這可以用lambda表達式寫得更加簡潔。 –
無關,但你可以做'.forEachOrdered(System.out :: println)' –