使用Java流来收集`for`循环

时间:2017-02-16 22:09:46

标签: java for-loop collections java-stream

我们如何使用Java Streams方法收集for循环中生成的对象?

例如,我们通过重复调用LocalDateYearMonth代表的一个月中的每一天生成一个YearMonth::atDay个对象。

YearMonth ym = YearMonth.of( 2017 , Month.AUGUST ) ;
List<LocalDate> dates = new ArrayList<>( ym.lengthOfMonth() );
for ( int i = 1 ; i <= ym.lengthOfMonth () ; i ++ ) {
    LocalDate localDate = ym.atDay ( i );
    dates.add( localDate );
}

可以使用流重写吗?

3 个答案:

答案 0 :(得分:8)

可以从IntStream开始重写:

YearMonth ym = YearMonth.of(2017, Month.AUGUST);
List<LocalDate> dates =
        IntStream.rangeClosed(1, ym.lengthOfMonth())
        .mapToObj(ym::atDay)
        .collect(Collectors.toList());

IntStream中的每个整数值都映射到所需的日期,然后在列表中收集日期。

答案 1 :(得分:2)

IntStream替换你的for循环:

YearMonth ym = YearMonth.of(2017, Month.AUGUST);
List<LocalDate> dates = new ArrayList<>(ym.lengthOfMonth());
IntStream.rangeClosed(1, ym.lengthOfMonth())
         .forEach(i -> dates.add(ym.atDay(i)));

答案 2 :(得分:1)

在Java 9中,LocalDate添加了一个特殊方法datesUntil,可以生成日期流:

LocalDate start = LocalDate.of(2017, Month.AUGUST, 1);
List<LocalDate> dates = start.datesUntil(start.plusMonths(1))
        .collect(Collectors.toList());