昨日、以下を書いたが、、
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() );