这样的操作应该可以在 Java 8 中实现,但不一定能够有效地完成 - 例如,您不一定可以并行化这样的操作,因为您必须按顺序查看元素。Stream
API没有提供一种简单的方法来做到这一点,但最简单的方法可能是,包装迭代器
以获得“take-while”实现,然后返回到a,然后是a。或者 - 也许 - 包装拆分器
,尽管它在此实现中无法再真正拆分。Stream.iterator()
Spliterator
Stream
下面是在 上未经测试的实现:takeWhile
Spliterator
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);
}