無駄な書き方で

前記事の書き方で十分と思いつつ無駄にStreamで書き換えてみる。

import static java.time.DayOfWeek.SUNDAY;
import java.time.LocalDate;
import static java.time.temporal.ChronoUnit.MONTHS;
import static java.time.temporal.TemporalAdjusters.dayOfWeekInMonth;
import java.util.stream.Stream;

public class ThirdSundays {
    public static void main(String[] args) {
        final LocalDate START = LocalDate.of(2016, 1, 1);
        final LocalDate END = LocalDate.of(2017, 1, 1);
        Stream
            .iterate(START, d -> d.plusMonths(1))
            .limit(MONTHS.between(START, END))
            .forEach(
                d -> System.out.println(
                    d.with(dayOfWeekInMonth(3, SUNDAY))
                )
            );
    }
}

ChronoUnit#betweenの第二引数の時点はexclusive扱いなので、
MONTHS.between(START, END)は12を返す。
これはENDの前日が2016-12-31であるから12か月なのではなく、
月に関してのbetweenなので、
ENDの前月が2016-12であるから12か月なのである。

実行結果は当然ながら同じになる。