Loops 使用流来迭代n次,而不是使用for循环来创建n个项
假设我要创建n个项目。在Java 8之前,我会写:Loops 使用流来迭代n次,而不是使用for循环来创建n个项,loops,java-8,java-stream,Loops,Java 8,Java Stream,假设我要创建n个项目。在Java 8之前,我会写: List<MyClass> list = new ArrayList<>(); for (int i = 0; i < n; i++) { list.add(new MyClass()); } 您可以使用: 如果您事先知道n,我认为使用其中一个流源创建一个已知正好有n个元素的流更为惯用。尽管有这些外观,但使用limit(10)并不一定会产生一个大小正好为10个元素的size流——它可能只有更少的元素。拥有
List<MyClass> list = new ArrayList<>();
for (int i = 0; i < n; i++) {
list.add(new MyClass());
}
您可以使用:
如果您事先知道n,我认为使用其中一个流源创建一个已知正好有n个元素的流更为惯用。尽管有这些外观,但使用limit(10)
并不一定会产生一个大小正好为10个元素的size
流——它可能只有更少的元素。拥有大小的流可以改进并行执行情况下的拆分
正如Sotirios Delimanolis在评论中指出的那样,你可以这样做:
List<MyClass> list = IntStream.range(0, n)
.mapToObj(i -> new MyClass())
.collect(toList());
List 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 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());
List List=Arrays.asList(新的MyClass[10]);
replaceAll(o->newMyClass());
但是这会导致一个固定大小的列表,尽管它是可变的。您认为流会更具表现力/效率/有用吗?出于好奇?您可以使用IntStream#range(0,N)
和mapToObject
。为什么不使用Stream.iterate
?@AsifMushtaq,因为每个项目的状态不依赖于前一个项目。
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());