filter Predicate を頑張って書けばいいのだけど、賢くない。
public static <T> Stream<T> whilestream(Stream<T> stream, Predicate<? super T> predicate) { Spliterator<T> itr = stream.spliterator(); return StreamSupport.stream( new Spliterators.AbstractSpliterator<T>(itr.estimateSize(), 0) { boolean still = true; @Override public boolean tryAdvance(Consumer<? super T> consumer) { if (still){ boolean hasNext = itr.tryAdvance(e->{ if (predicate.test(e)){ consumer.accept(e); }else{ still = false; } }); return hasNext && still; } return false; } }, false); }
1から始まって10以下を println
whilestream(IntStream.iterate(1, n->n + 1).boxed(), i->i <= 10) .forEach(System.out::println);