如何使用 Java 8 创建无限流

2022-08-31 14:00:25

有没有一种简单的方法可以在没有外部库的情况下使用创建无限流?

例如在Scala中:

Iterator.iterate(0)(_ + 2)

答案 1

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

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);

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


答案 2

下面是一个示例:

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()


推荐