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

用Java8生成器实现自然数的无限序列,java,iterator,generator,java-8,Java,Iterator,Generator,Java 8,我用Java8迭代器为自然数的无限序列(流)定义了natural IntStream natural = IntStream.iterate(0, i -> i + 1); natural .limit(10) .forEach(System.out::println); 现在,我想用Java8generator来定义它 IntStream natural = IntStream.iterate(0, i -> i + 1); natural .limit(10) .f

我用Java8
迭代器为自然数的无限序列(
)定义了
natural

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

natural
 .limit(10)
 .forEach(System.out::println);
现在,我想用Java8
generator
来定义它

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

natural
 .limit(10)
 .forEach(System.out::println);
静态流生成(供应商)

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

注意:@assylias使用
AtomicInteger
成功地用lambda实现了这一点。他或许应该得到公认的答案


我不确定您是否可以使用lambda(因为它是有状态的),但对于普通的
供应商
这将起作用:

IntSupplier generator = new IntSupplier() {
    int current = 0;

    public int getAsInt() {
        return current++;
    }
};

IntStream natural = IntStream.generate(generator);
但是,我非常喜欢您当前的解决方案,因为这是
迭代(int seed,IntUnaryOperator f)
IMHO的目的:

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\u VALUE的所有值。生成器是什么意思?你是说
Supplier
?从未使用过java 8,但这就是你想要的吗?我相信使用
Stream.generate(Supplier)
会比你现在拥有的更复杂。Joffrey,可能是
static Stream generate(Supplier)
,Vinc,是的,我读过这篇文章,但不知怎么搞不清楚。谢谢汉克斯·乔弗里,虽然它不是无限的,是吗在大多数情况下,这将是:
IntStream.iterate(0,i->i==Integer.MAX_VALUE?0:i+1)
——我的意思是,如果您只想跟踪某个进程并对某个窗口感兴趣。否则,可能是BigInteger?@Deroude很好。虽然我猜在有限的计算机上没有什么是真正的无限的,
biginger
在某一点上会受到可用内存的限制。我认为这在OP的上下文中并不重要。我必须承认,这是一种不必创建类的简洁方法+1.这个答案应该是公认的,而不是我的。