【问题标题】:Infinite sequence of Natural numbers with Java8 generator使用 Java8 生成器的无限自然数序列
【发布时间】:2014-12-04 07:39:51
【问题描述】:

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

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

natural
 .limit(10)
 .forEach(System.out::println);

现在,我想用 Java8 定义它generator

静态流生成(供应商)

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

【问题讨论】:

  • 生成器是什么意思?你的意思是Supplier
  • 从未使用过 java 8,但这就是你要找的codeproject.com/Articles/793374/Generators-with-Java
  • 我相信使用Stream.generate(Supplier) 会比你现在使用的更复杂。
  • Joffrey,可能是 static Stream generate(Supplier s) 和 Vinc,是的,我读过这篇文章,但不知何故我不清楚。谢谢

标签: java iterator generator java-8


【解决方案1】:

注意:@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) IMHO 的目的:

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

【讨论】:

  • 谢谢乔佛里 ////////
  • 它不是无限的,不是吗? ;) -- 对于大多数目的,这将是:IntStream.iterate(0, i -> i == Integer.MAX_VALUE ? 0 : i + 1) -- 我的意思是,如果您只想跟踪某个进程并且对窗口感兴趣。否则,可能是 BigInteger?
  • @Deroude 好点。虽然我猜在有限的计算机上没有什么是真正无限的,BigInteger 在某些时候会受到可用内存的限制。我认为这在 OP 的上下文中并不重要。
【解决方案2】:

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

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

注意:我将 AtomicInteger 用作可变整数,而不是为了线程安全:如果您将流并行化,则顺序将不符合预期。

【讨论】:

  • 这是一种无需创建类的简洁方法,我不得不承认。 +1。这个答案应该是被接受的,而不是我的。
【解决方案3】:

这是内置于IntStream:

IntStream.range(0, Integer.MAX_VALUE)

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

【讨论】:

    猜你喜欢
    • 2015-07-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多