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

Mar*_*man 11 java collections list java-8

我正在尝试创建一个包含n个元素的对象列表.我试图以尽可能多的java 8方式做到这一点.类似于c#的问题: 创建N个对象并将它们添加到列表中

像这样的东西:

List <Objects> getList(int numOfElements)
{

}
Run Code Online (Sandbox Code Playgroud)

err*_*ist 23

您可以Stream.generate(Supplier<T>)结合使用对构造函数的引用,然后使用它Stream.limit(long)来指定应该构造的数量:

Stream.generate(Objects::new).limit(numOfElements).collect(Collectors.toList());    
Run Code Online (Sandbox Code Playgroud)

至少对我而言,这比使用IntStream迭代更加清晰,更清楚地说明了意图,例如Alberto Trindade Tavares所建议的.

如果您想要在复杂性和内存使用方面表现更好的东西,请将结果大小传递给Stream.collect(Collector<? super T,A,R>):

Stream.generate(Objects::new).limit(numOfElements).collect(Collectors.toCollection(() -> new ArrayList<>(numOfElements)));
Run Code Online (Sandbox Code Playgroud)

  • @Eugene:不,在这两种情况下你都有相同的分裂器,因为源仍然是一个范围.但是带有(sub)大小的流的`toArray`将立即分配最终数组并让每个线程写入该数组的右侧部分,而`collect(Collectors.toList())`则收集到本地列表和需求中额外的合并步骤.此外,`toList()`使用的列表可能需要(多个)容量增加操作.另见[此评论](/sf/ask/2014751581/#comment45848538_28782165) (4认同)
  • 虽然正确,但请注意,这会比"IntStream"方法更加并行化 - 因为这仍然是一个无限流(限制不会引入`SIZED`属性); 否则+1来自我. (3认同)
  • @Eugene:如果你想要最大的并行性能,你应该使用`Arrays.asList(IntStream.range(0,numOfElements).mapToObj(Objects :: new).toArray(Objects [] :: new));` (2认同)

Eug*_*ene 21

如果我的问题是正确的:

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()); 
}
Run Code Online (Sandbox Code Playgroud)

如果你想要同一个对象n次:

Collections.nCopies(n, T)
Run Code Online (Sandbox Code Playgroud)

  • `Collections.nCopies(n, T)` 将返回一个不可变的 `List&lt;T&gt;` 如果你需要一个可编辑的 `List&lt;T&gt;` 你应该创建一个空的 List 然后调用 addAll 传递 nCopies `List 的结果&lt;T&gt; temp = new ArrayList&lt;&gt;(); temp.addAll(Collections.nCopies(n, T)); 返回温度;` (2认同)
  • @afj88 答案的简短版本:```return new ArrayList&lt;&gt;(Collections.nCopies(n, T));``` (2认同)

Alb*_*res 6

您在 Java 8 中提到的 C# 代码的等效实现streams如下(编辑以使用 mapToObj,由 @Eugene 建议):

List <Objects> getList(int numOfElements)
{
  return IntStream.range(0, numOfElements)
                  .mapToObj(x -> new Objects())
                  .collect(Collectors.toList()); 
}
Run Code Online (Sandbox Code Playgroud)

  • 我也不太确定,但我认为他想向他正在创建的对象构造函数发送一些参数 - 至少是“x”,所以看起来应该是“.map(x -&gt; new Objects(x ))` 或更好的 `.map(Objects::new)` (2认同)