这样的操作在Java 8中应该是可能的
Stream,但不一定能有效地完成-例如,您不必并行化这样的操作,因为您必须按顺序查看元素。
该API并没有提供一种简便的方法,但是最简单的方法可能是采用
Stream.iterator(),将其包装Iterator为具有“
take-while”的实现,然后返回到
Spliterator然后是a Stream。或者-也许-包装
Spliterator,尽管在此实现中它实际上不能再拆分了。
下面是一个未经测试的执行
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);}


