我已经看到了一些用于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'所得到的结果,但是你可以得到。 –
为了在这里提取任何真正的并行性,谓词必须非常昂贵(例如,试图分解非常大的数字)。这不是不可能的,但它不太可能。 –