sec*_*tar 8 java lambda java-8 java-stream
如何Supplier使用lambda表达式替换此处的代码
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);
Run Code Online (Sandbox Code Playgroud)
上面代码的输出是:
1
2
3
4
5
6
7
8
9
10
Run Code Online (Sandbox Code Playgroud)
这Stream::generate不适合这个问题.根据文件:
这适用于生成恒定流,随机元素流等.
您可能想要使用IntStream::range:
IntStream intStream = IntStream.range(1, 11);
intStream.forEach(System.out::println);
Run Code Online (Sandbox Code Playgroud)另一种解决方案可能是使用以下IntStream.iterate方法IntUnaryOperator:使用以下方法可以舒适地控制增量:
IntStream intStream = IntStream.iterate(1, i -> i+1).limit(10);
intStream.forEach(System.out::println);
Run Code Online (Sandbox Code Playgroud)如上所述,Stream::generate它适用于恒定流或随机元素.可以使用类获取random元素,Random因此您可能希望使用AtomicInteger以下方法获取增量:
AtomicInteger atomicInteger = new AtomicInteger(1);
IntStream intStream = Stream.generate(atomicInteger::getAndIncrement).limit(10);
intStream.forEach(System.out::println);
Run Code Online (Sandbox Code Playgroud)或者你可以使用它
IntStream.iterate(1, i -> i + 1)
.limit(10)
.forEach(System.out::println);
Run Code Online (Sandbox Code Playgroud)
如果你一定要专门使用的话,就像这样Stream.generate:
IntStream inStream = Stream.generate(new AtomicInteger(1)::getAndIncrement)
.limit(10)
.mapToInt(t -> t);
inStream.forEach(System.out::println);
Run Code Online (Sandbox Code Playgroud)
编辑:使用IntStream.generate,您可以将其执行为
IntStream.generate(new AtomicInteger(1)::getAndIncrement).limit(10);
Run Code Online (Sandbox Code Playgroud)
注意:就 API 设计而言,更好的解决方案肯定是用于Stream.iterate此类用例。