我正在尝试创建一个包含n个元素的对象列表。我试图以尽可能多的java 8方式做到这一点。类似于c#的问题在这里: Creating N objects and adding them to a list
这样的事情:
List <Objects> getList(int numOfElements)
{
}
答案 0 :(得分:21)
您可以将Stream.generate(Supplier<T>)
与对构造函数的引用结合使用,然后使用Stream.limit(long)
指定应构造的数量:
Stream.generate(Objects::new).limit(numOfElements).collect(Collectors.toList());
至少对我来说,这比使用IntStream
进行迭代时更具可读性和说明意图,例如Alberto Trindade Tavares suggested
如果您想要在复杂性和内存使用方面表现更好的内容,请将结果大小传递给Stream.collect(Collector<? super T,A,R>)
:
Stream.generate(Objects::new).limit(numOfElements).collect(Collectors.toCollection(() -> new ArrayList<>(numOfElements)));
答案 1 :(得分:18)
如果我的问题是对的:
List <Object> getList(int numOfElements){
return IntStream.range(0, numOfElements)
.mapToObj(Object::new) // or x -> new Object(x).. or any other constructor
.collect(Collectors.toList());
}
如果你想要同一个对象n次:
Collections.nCopies(n, T)
答案 2 :(得分:2)
您在Java 8中提到的带有streams
的C#代码的等效实现如下(编辑使用mapToObj,由@Eugene建议):
List <Objects> getList(int numOfElements)
{
return IntStream.range(0, numOfElements)
.mapToObj(x -> new Objects())
.collect(Collectors.toList());
}
答案 3 :(得分:2)
为什么不保持简单?如果你想使用LINQ或Lambda,它肯定是可能的,但问题是它是否更具可读性或可维护性。
List <Objects> getList(int numOfElements)
{
List<Objects> objectList = new LinkedList<>();
for(int i = 0; i <= numOfElements; i++)
{
objectList.add(new Object());
}
return objectList;
}
如果你坚持认为这可能是lambda:
return IntStream.range(0, numOfElements)
.mapToObj(x -> new Objects())
.collect(Collectors.toList());
来自@Alberto Trindade的信条,因为他发布的速度比我快。
答案 4 :(得分:2)
如果您不介意第三方依赖关系,则以下内容适用于Eclipse Collections:
List<Object> objects = Lists.mutable.withNValues(10, Object::new);
Verify.assertSize(10, objects);
注意:我是Eclipse Collections的提交者。