Java9 dropWhile と takeWhile を意識した Java8 で実行する方法

昨日、以下を書いたが、、
Java9 Stream の takeWhile を意識した Java8 での方法 - Oboe吹きプログラマの黙示録
dropWhile もと思い、、改めて、dropWhile の方法も。。。

public static <T> Stream<T> dropstream(Stream<T> stream, Predicate<? super T> predicate) {
   Spliterator<T> itr = stream.spliterator();
   return StreamSupport.stream(
      new Spliterators.AbstractSpliterator<T>(itr.estimateSize(), 0){
         @Override
         public boolean tryAdvance(Consumer<? super T> consumer) {
            return itr.tryAdvance(e->{
               if (!predicate.test(e)) consumer.accept(e);
            });
         }
      }, false
   );
}

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

サンプル

List<Integer> list = Stream.iterate(1, i->i+1).limit(10).collect(Collectors.toList());

System.out.println(list);
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

この1~10のリストを、4より小さければスキップしたリストにするのは、、

List<Integer> list = dropstream(list.stream(), i->i < 4).collect(Collectors.toList());

System.out.println(list2);
[4, 5, 6, 7, 8, 9, 10]

現在日より2日後~月末までの日付のリストを求めるのは、

LocalDate now = LocalDate.now();
Stream<LocalDate> nowtailDates 
= whilestream(Stream.iterate(now, d->d.plusDays(1))
  , d->!d.isAfter(LocalDate.of(now.getYear(), now.getMonthValue(), now.lengthOfMonth()))
);
List<LocalDate> list 
= dropstream(nowtailDates, d->d.isBefore(now.plusDays(2))).collect(Collectors.toList());

ということになる。
現在日=2020-4-19 なら、リストの標準出力結果は、、

[2020-04-21, 2020-04-22, 2020-04-23, 2020-04-24, 2020-04-25, 2020-04-26, 2020-04-27, 2020-04-28, 2020-04-29, 2020-04-30]

Stream 変数宣言して間を作りたくなければ、、

List<LocalDate> rlist
= dropstream(whilestream(Stream.iterate(now, d->d.plusDays(1))
      , d->!d.isAfter(LocalDate.of(now.getYear(), now.getMonthValue(), now.lengthOfMonth()))
   )
   , d->d.isBefore(now.plusDays(2))).collect(Collectors.toList()
);