Я видел некоторые версии для Java 8 stream API, но все они, похоже, превращают поток в непараллельный поток. Например this одно:Как реализовать параллельную поддержку takeWhile для Stream API в Java 8?
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' в этом потоке, но это так хорошо, как вы можете получить. –
Чтобы извлечь какой-либо реальный параллелизм здесь, предикат должен быть безумно дорогим (например, пытаясь учитывать очень большие числа). Это не невозможно, но это маловероятно. –