Java9 Stream の takeWhile を意識した Java8 での方法

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);