如何使用Java 8创建无限流

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (33)

有没有一种简单的方法来创建一个使用java-8而无需外部库的无限流?

例如在Scala中:

Iterator.iterate(0)(_ + 2)
提问于
用户回答回答于

是的,有一个简单的方法:

IntStream.iterate(0, i -> i + 2);

用作用例:

IntStream.iterate(0, i -> i + 2)
         .limit(100)
         .forEach(System.out::println);

打印出0到198,逐步增加2步。

通用方法是:

Stream.iterate(T seed, UnaryOperator<T> f);

后者在使用中可能更不常见。

用户回答回答于

这里是一个例子:

PrimitiveIterator.OfInt it = new PrimitiveIterator.OfInt() {
    private int value = 0;

    @Override
    public int nextInt() {
        return value++;
    }

    @Override
    public boolean hasNext() {
        return true;
    }
};

Spliterator.OfInt spliterator = Spliterators.spliteratorUnknownSize(it,
    Spliterator.DISTINCT | Spliterator.IMMUTABLE |
    Spliterator.ORDERED | Spliterator.SORTED);

IntStream stream = StreamSupport.intStream(spliterator, false);

如你所见,这有点冗长。要打印此流的前10个元素,请执行以下操作:

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

你也可以改变元素,就像你在Scala例子中做的那样:

IntStream plusTwoStream = stream.map(n -> n + 2);

请注意,有内置的无限流,例如java.util.Random.ints()它给你一个随机整数的无限流。

扫码关注云+社区