Java8 までは、過去書いたように、、、
LocalDate の Stream 生成 - Oboe吹きプログラマの黙示録
Stream で LocalDateリストを生成 - Oboe吹きプログラマの黙示録
Java で横長カレンダーを書くための処理 - Oboe吹きプログラマの黙示録
のように、LocalDate の Stream の Iterator あるいは、IntStream で期間の範囲のSteam 生成をしていた。
LocalDate start = LocalDate.of(2017, 11, 28); LocalDate end = LocalDate.of(2017, 12, 5);
の時に、
Stream<LocalDate> stream = Stream.iterate(start, t->t.plusDays(1)).limit(Period.between(start, end).getDays() + 1);
あるいは、、
Stream<LocalDate> stream = IntStream.rangeClosed(1, Period.between(start, end).getDays()).mapToObj(i->start.plusDays(i));
Java9 で、Jigsaw 以外の機能追加は、Stream の of の他に、limit が数値しか渡せず不便であったのをカバーするような
dropWhile(Predicate predicate)
takeWhile(Predicate predicate)
が追加されたことがよく、focus されている。
この ~まで、という考え方は、日付クラス LocalDate にも期間の Stream 生成でも
Java9 では以下のメソッドが追加された。
public Stream
public Stream
LocalDate start = LocalDate.of(2017, 11, 28); LocalDate end = LocalDate.of(2017, 12, 5); Stream<LocalDate> stream = start.datesUntil(end.plusDays(1));
と簡潔に書けてしまうのである。
LocalDate start = LocalDate.of(2017, 11, 28); LocalDate end = LocalDate.of(2017, 12, 5); start.datesUntil(end, Period.ofDays(2)).forEach(System.out::println);
と書けば、結果は、以下のよぅになる。
2017-11-28 2017-11-30 2017-12-02 2017-12-04