用谓词限制流是否存在限制(潜在无限)的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()IteratorSpliteratorStreamSpliterator
takeWhileSpliterator:
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
提交
取消
