如何使用Java 8创建无限流

时间:2014-03-18 15:16:31

标签: java java-8

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

例如在Scala中:

Iterator.iterate(0)(_ + 2)

4 个答案:

答案 0 :(得分:95)

是的,有一种简单方式:

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

后者在使用中可能更为罕见。

答案 1 :(得分:7)

以下是一个例子:

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())会为您提供无限的随机整数流。

答案 2 :(得分:1)

Java 8 中还有另一种可能的解决方案:

AtomicInteger adder = new AtomicInteger();
IntStream stream = IntStream.generate(() -> adder.getAndAdd(2));

重要:仅当流是连续的时,数字顺序才保留。


还值得注意的是,自 Java 9 起,已经添加了IntStream.iterate的新版本:

static IntStream iterate​(int seed,
                         IntPredicate hasNext,
                         IntUnaryOperator next);
  • 种子-初始元素;
  • hasNext-谓词,应用于元素以确定流何时必须终止;
  • next-一个函数,该函数将应用于上一个元素以产生新元素。

示例:

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

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

答案 3 :(得分:0)

您可以通过实现流和使用者来构建自己的InfiniteStream并组合两者,并且可能需要排队以将数据排队为:

public class InfiniteStream<T> implements Consumer<T>, Stream<T> {
private final Stream<T> stream;
private final Queueing q;
...
public InfiniteStream(int length) {
    this.q = new Queueing(this.length);
    this.stream = Stream.generate(q);
    ...
}
    //implement stream methods
    //implement accept
}

在这里查看完整代码 https://gist.github.com/bassemZohdy/e5fdd56de44cea3cd8ff