簡體   English   中英

如何使用 Java 8 創建無限流

[英]How to create an infinite stream with 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() ,它為您提供無限的隨機整數流。

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

您可以通過實現流和消費者來構建自己的 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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM