無駄な書き方で
前記事の書き方で十分と思いつつ無駄に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か月なのである。
実行結果は当然ながら同じになる。