使用流迭代 n 次而不是使用 for 循环创建 n 项

Using a stream to iterate n times instead of using a for loop to create n items

假设我要创建 n 个项目。前 Java 8,我会写:

List<MyClass> list = new ArrayList<>();
for (int i = 0; i < n; i++) {
    list.add(new MyClass());
}

有没有一种优雅的方法可以使用流来创建 n 个项目?
我想到了这个:

List<MyClass> list = Stream.iterate(0, i -> i).limit(10)
    .map(o -> new MyClass()).collect(Collectors.toList());

是否有 standard/better 编码方式?

请注意,actual 用法有点复杂,使用流会更灵活,因为我可以立即通过一行中的其他函数抽取项目,甚至无需创建引用列表,例如将它们分组:

Stream.iterate(0, i -> i).limit(10).map(o -> new MyClass())
    .collect(Collectors.groupingBy(...));

您可以使用 Stream#generate with limit:

Stream.generate(MyClass::new).limit(10);

如果您事先知道 n,我认为使用其中一个流源来创建已知具有 n 的流更为惯用 个元素。尽管看起来如此,但使用 limit(10) 并不一定会导致 SIZED 流恰好包含 10 个元素——它可能更少。在并行执行的情况下,拥有 SIZED 流可以改进拆分。

正如 Sotirios Delimanolis 在评论中指出的那样,您可以这样做:

List<MyClass> list = IntStream.range(0, n)
    .mapToObj(i -> new MyClass())
    .collect(toList());

另一种选择是这个,虽然我不清楚它是否更好:

List<MyClass> list2 = Collections.nCopies(10, null).stream()
    .map(o -> new MyClass())
    .collect(toList());

您也可以这样做:

List<MyClass> list = Arrays.asList(new MyClass[10]);
list.replaceAll(o -> new MyClass());

但这会产生一个固定大小但可变的列表。