使用流迭代 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());
但这会产生一个固定大小但可变的列表。
假设我要创建 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());
但这会产生一个固定大小但可变的列表。