Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/346.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 8-初始化列表(列表)_Java_Java 8_Java Stream - Fatal编程技术网

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

Java 8-初始化列表(列表),java,java-8,java-stream,Java,Java 8,Java Stream,我有一个关于Java8和列表的问题。是否可以比我下面的代码更简单地初始化列表 final List<List<ScheduleIntervalContainer>> weekScheduler = new ArrayList<>(); weekScheduler.add(0, new ArrayList<ScheduleIntervalContainer>()); weekScheduler.add(1, new ArrayList<Sch

我有一个关于Java8和列表的问题。是否可以比我下面的代码更简单地初始化列表

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>());
final List weekScheduler=new ArrayList();
添加(0,新ArrayList());
add(1,newArrayList());
add(2,newArrayList());
add(3,newArrayList());
add(4,newArrayList());
add(5,newArrayList());
add(6,newArrayList());
您可以使用:

List<List<ScheduleIntervalContainer>> weekScheduler = 
     IntStream.rangeClosed(0, 6).mapToObj(i -> new ArrayList<ScheduleIntervalContainer>())
                                .collect(Collectors.toList());
List weekScheduler=
IntStream.rangeClosed(0,6).mapToObj(i->newarraylist())
.collect(Collectors.toList());

这将创建一个从0到6(包括)的
int
值流,将每个int映射到类的新
ArrayList
,并将结果收集到
列表中。您可以使用循环或IntStream

final List<List<ScheduleIntervalContainer>> weekScheduler = new ArrayList<>();
IntStream.range(0, 7).forEach(day -> weekScheduler.add(new ArrayList<>()));
final List weekScheduler=new ArrayList();
IntStream.range(0,7).forEach(day->weekScheduler.add(newarraylist());

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

List<List<ScheduleIntervalContainer>> weekScheduler = new ArrayList<>();
for (int i = 0; i < 7; i++)
    weekScheduler.add(new ArrayList<>());
List weekScheduler=new ArrayList();
对于(int i=0;i<7;i++)
添加(新的ArrayList());
但是,如果您想要Java 8解决方案:

List<List<ScheduleIntervalContainer>> weekScheduler 
        = Stream.generate(ArrayList<ScheduleIntervalContainer>::new)
                .limit(7)
                .collect(Collectors.toList());
List weekScheduler
=Stream.generate(ArrayList::new)
.限额(7)
.collect(Collectors.toList());

每当我使用列表编码时,我都使用for循环来加速声明。在您的情况下,我强烈建议使用任何类型的循环,但for循环可能是最简单的。

您可以在for循环中执行。我将使用循环并将其隐藏在扩展ArrayList的类“WeekScheduler”中,这样我就不必再看到代码了。。。永远不会。你的代码对我不起作用。它抱怨试图将
ArrayList
转换为
ArrayList
@Tom您确定复制正确吗?是否正确导入了java.util.List?这段代码对我来说很好(JDK1.8.0_51)@Holger这是我的答案@Paul Boddington:不幸的是,这是设计上的限制,正如所解释的,推理不会传播到方法调用的接收者,因此不适用于链式调用。目前还不清楚这个限制是否会被取消,何时会被取消。您应该注意,这个代码有一个预期的(尽管无害)副作用
mapToObj
需要使用
int
的函数。因此,方法引用
ArrayList::new
将解析为
ArrayList(int)
构造函数。换句话说,数字
0
6
被误解为所创建列表的初始容量。在这里使用
i->new ArrayList()
会更干净…。这是函数式API上的命令式编程。您应该结合使用
map
collect
。@Peter Lawrey:这并不简单,因为您在示例中省略了创建
weekScheduler
列表。让流创建列表并不会使代码变得更复杂。@PeterLawrey我不是说这个的人,你需要和Oracle合作。如果您那么喜欢命令式编程,那么首先为什么要使用流API呢?或者我们应该仅仅因为感觉更好就开始在答案中发布坏习惯吗?@Peter Lawrey:但这不是函数式编程风格或流API的产物,而是有限的类型推断。如果没有限制,您可以只使用
…->new ArrayList()
ArrayList::new
@PeterLawrey,实际上您的答案仍然被认为是错误的做法,可以很容易地纠正。再说一次,我们是否应该因为觉得这是正确的,就开始在我们的答案中张贴不好的做法?