我已經看到了一些用於Java 8流API的takeWhile
實現,但它們似乎都將流轉換爲非並行流。例如this之一:如何在Java 8中爲Stream API實現並行支持takeWhile?
static <T> Spliterator<T> takeWhile(
Spliterator<T> splitr, Predicate<? super T> predicate) {
return new Spliterators.AbstractSpliterator<T>(splitr.estimateSize(), 0) {
boolean stillGoing = true;
@Override public boolean tryAdvance(Consumer<? super T> consumer) {
if (stillGoing) {
boolean hadNext = splitr.tryAdvance(elem -> {
if (predicate.test(elem)) {
consumer.accept(elem);
} else {
stillGoing = false;
}
});
return hadNext && stillGoing;
}
return false;
}
};
}
static <T> Stream<T> takeWhile(Stream<T> stream, Predicate<? super T> predicate) {
return StreamSupport.stream(takeWhile(stream.spliterator(), predicate), false);
}
這裏StreamSupport.stream(takeWhile(stream.spliterator(), predicate), false);
轉動傳遞給takeWhile
成連續流的流。是否有人知道支持並行流的實現,或者我如何修改此代碼以使其維護/支持並行流?
你不能,真的。對不起,但你必須解決這個問題。這實際上是一種固有的順序操作。你可以使用默認的非常有限的並行性,這對所有的東西都適用,這就是你在流中使用'.parallel'所得到的結果,但是你可以得到。 –
爲了在這裏提取任何真正的並行性,謂詞必須非常昂貴(例如,試圖分解非常大的數字)。這不是不可能的,但它不太可能。 –