使用Java流来收集`for`循环中生成的对象

Bas*_*que 3 java collections for-loop java-stream

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

例如,这里我们LocalDate为一个月中的每一天生成一个对象,YearMonth通过重复调用来表示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 );
}
Run Code Online (Sandbox Code Playgroud)

可以使用流重写吗?

Mar*_*nko 8

它可以从IntStream开始重写:

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

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

  • 我现在知道了.[A]如果我关心`List`的支持具体实现,那么我必须提供[`Supplier`](https://docs.oracle.com/javase/8/docs/api/java/util/function /Supplier.html)传递了对[`Collectors.toCollection`]的调用(https://docs.oracle.com/javase/8/docs/api/java/util/stream/Collectors.html#toCollection-java. util.function.Supplier-).在这种情况下,供应商采用方法引用"ArrayList :: new"的形式.[B]如果我*不关心实现`List`接口的具体类,那么使用你的答案中看到的更简单的简单代码. (3认同)
  • 你想要`List <LocalDate>`,你就得到了.如果你想明确定义应该使用哪个List实现,你也可以这样做:`Collectors.toCollection(ArrayList :: new)` (2认同)