如何创建包含N个对象的列表?

时间:2017-07-24 08:14:28

标签: java list collections java-8

我正在尝试创建一个包含n个元素的对象列表。我试图以尽可能多的java 8方式做到这一点。类似于c#的问题在这里: Creating N objects and adding them to a list

这样的事情:

List <Objects> getList(int numOfElements)
{

}

5 个答案:

答案 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的提交者。