Java8生成器的自然数无限序列

我用Java8 iterator为自然数的无限序列( Stream )定义了natural

 IntStream natural = IntStream.iterate(0, i -> i + 1); natural .limit(10) .forEach(System.out::println); 

现在,我想用Java8 generator来定义它。

静态流生成(供应商)

什么是最简单的方法? 谢谢。

注意:@assylias使用AtomicInteger设法使用lambda。 他应该得到接受的答案。


我不确定你能用lambda做到这一点(因为它是有状态的),但是对于一个简单的Supplier这将有效:

 IntSupplier generator = new IntSupplier() { int current = 0; public int getAsInt() { return current++; } }; IntStream natural = IntStream.generate(generator); 

但是, 我非常喜欢你当前的解决方案 ,因为这是iterate(int seed, IntUnaryOperator f)的目的iterate(int seed, IntUnaryOperator f)恕我直言:

 IntStream natural = IntStream.iterate(0, i -> i + 1); 

使用生成器,您需要跟踪当前索引。 一种方法是:

 IntStream natural = IntStream.generate(new AtomicInteger()::getAndIncrement); 

注意:我使用AtomicInteger作为可变整数而不是其线程安全性:如果您并行化流,则顺序将不会如预期的那样。

这是内置于IntStream

 IntStream.range(0, Integer.MAX_VALUE) 

这将返回所有值(但不包括) Integer.MAX_VALUE

Interesting Posts