如何使用lambda表达式替换此处的Supplier
代码
IntStream inStream = Stream.generate(new Supplier<Integer>() {
int x= 1;
@Override
public Integer get() {
return x++ ;
}
}).limit(10).mapToInt(t -> t.intValue());
inStream.forEach(System.out::println);
以上代码的输出为:
1
2
3
4
5
6
7
8
9
10
答案 0 :(得分:8)
Stream::generate
不适合此问题。根据文档:
这适用于生成恒定流,随机元素流等。
您可能想使用IntStream::range
:
IntStream intStream = IntStream.range(1, 11);
intStream.forEach(System.out::println);
另一个解决方案可能是使用IntStream.iterate
,您可以使用IntUnaryOperator
舒适地控制增量:
IntStream intStream = IntStream.iterate(1, i -> i+1).limit(10);
intStream.forEach(System.out::println);
如上所述,Stream::generate
适用于恒定流或随机元素。可以使用类Random
获得随机元素,因此在这里您可能想使用AtomicInteger
获得增量:
AtomicInteger atomicInteger = new AtomicInteger(1);
IntStream intStream = Stream.generate(atomicInteger::getAndIncrement).limit(10);
intStream.forEach(System.out::println);
答案 1 :(得分:5)
或者您可以使用
IntStream.iterate(1, i -> i + 1)
.limit(10)
.forEach(System.out::println);
答案 2 :(得分:3)
如果您必须专门使用Stream.generate
,则可能会这样:
IntStream inStream = Stream.generate(new AtomicInteger(1)::getAndIncrement)
.limit(10)
.mapToInt(t -> t);
inStream.forEach(System.out::println);
编辑 :使用IntStream.generate
,您可以执行以下操作
IntStream.generate(new AtomicInteger(1)::getAndIncrement).limit(10);
注意 :在API设计方面,更好的解决方案肯定是在这种用例中使用Stream.iterate
。