Java 8 - 初始化列表(列表)

qum*_*uma 0 java java-8 java-stream

我有一个关于Java 8和列表的问题.是否可以比下面的代码更容易初始化List?

final List<List<ScheduleIntervalContainer>> weekScheduler = new ArrayList<>();

weekScheduler.add(0, new ArrayList<ScheduleIntervalContainer>());
weekScheduler.add(1, new ArrayList<ScheduleIntervalContainer>());
weekScheduler.add(2, new ArrayList<ScheduleIntervalContainer>());
weekScheduler.add(3, new ArrayList<ScheduleIntervalContainer>());
weekScheduler.add(4, new ArrayList<ScheduleIntervalContainer>());
weekScheduler.add(5, new ArrayList<ScheduleIntervalContainer>());
weekScheduler.add(6, new ArrayList<ScheduleIntervalContainer>());
Run Code Online (Sandbox Code Playgroud)

Pau*_*ton 10

就个人而言,我只会使用一个for循环:

List<List<ScheduleIntervalContainer>> weekScheduler = new ArrayList<>();
for (int i = 0; i < 7; i++)
    weekScheduler.add(new ArrayList<>());
Run Code Online (Sandbox Code Playgroud)

但是,如果您需要Java 8解决方案:

List<List<ScheduleIntervalContainer>> weekScheduler 
        = Stream.generate(ArrayList<ScheduleIntervalContainer>::new)
                .limit(7)
                .collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)


Tun*_*aki 7

您可以使用:

List<List<ScheduleIntervalContainer>> weekScheduler = 
     IntStream.rangeClosed(0, 6).mapToObj(i -> new ArrayList<ScheduleIntervalContainer>())
                                .collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)

这将创建一个int从0到6(包括)的值流,将每个int映射到ArrayList您的新类,并将结果收集到a List.

  • 您应该注意,此代码具有意图(尽管无害)的副作用.`mapToObj`需要一个消耗`int`的函数.因此,方法引用"ArrayList :: new"将在此处解析为`ArrayList <>(int)`构造函数.换句话说,数字"0"到"6"被误解为创建列表的初始容量.使用`i-> new ArrayList <ScheduleIntervalContainer>()`这里会更清晰...... (3认同)
  • @Tom你确定你正确复制了吗?并正确导入java.util.List?这个代码编译好我(JDK 1.8.0_51) (2认同)
  • @Paul Boddington:遗憾的是,这是设计上的限制,如[here](http://stackoverflow.com/a/26883991/2711488)所述,推理不会传播到方法调用的*receiver*,因此不适用于链式调用.尚不清楚这种限制是否以及何时解除. (2认同)