用谓词限制流是否存在限制(潜在无限)的Java 8流操作?Stream直到第一个元素不能匹配谓词?在Java 9中,我们可以使用takeWhile如下面的示例所示,打印小于10的所有数字。IntStream
.iterate(1, n -> n + 1)
.takeWhile(n -> n < 10)
.forEach(System.out::println);由于Java 8中没有这样的操作,以一般方式实现它的最佳方法是什么?
3 回答
慕尼黑8549860
TA贡献1818条经验 获得超11个赞
Stream
Stream.iterator()
Iterator
Spliterator
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);}
萧十郎
TA贡献1815条经验 获得超13个赞
allMatch()
IntStream .iterate(1, n -> n + 1) .peek(n->{if (n<10) System.out.println(n);}) .allMatch(n->n < 10);
添加回答
举报
0/150
提交
取消