簡體   English   中英

如何使用索引而不是前一個元素生成流?

[英]How to generate a stream using an index rather than the previous element?

如何生成“新”數據流? 具體來說,我希望能夠創建包含不可逆功能的數據。 如果我想從數組創建流我會做

Stream.of(arr)

來自收藏

col.stream()

可以使用lambda表達式生成恆定的流

Stream.generate(() -> "constant")

可以通過以下方式實現基於最后輸入的 (任何可逆函數)

Stream.iterate(0, x -> x + 2)

但是,如果我想創建一個更通用的生成器(例如,一個數字是否被三除的輸出:0,0,1,0,0,1,0,0,1 ...),而無需創建新類。

主要問題是我需要某種方式將索引輸入到lambda中,因為我想擁有一個模式,而不要依賴於函數的最后輸出。

注意: someStream.limit(length)可能用於停止流的長度,因此無限流生成器實際上是我想要的。

如果您希望函數具有索引的無限流,則可以考慮使用以下方法創建“ 幾乎無限 ”的流:

IntStream.rangeClosed(0, Integer.MAX_VALUE).map(index -> your lambda)

分別

IntStream.rangeClosed(0, Integer.MAX_VALUE).mapToObj(index -> your lambda)

用於Stream而不是IntStream

這並不是真正的無限,但是在Integer.MAX_VALUE之后沒有用於表示索引的int值,因此在觸及該索引時您要解決一個語義問題。

另外,當改用LongStream.rangeClosed(0, Long.MAX_VALUE).map(index -> yourLambda)且每個元素評估僅需一納秒時,處理所有元素將花費近三百年的時間。

但是,當然,有一種方法可以使用

Stream.iterate(BigInteger.ZERO, BigInteger.ONE::add).map(index -> yourLambda)

如果索引無法再顯示在堆內存中,則可能永遠運行或更可能使用OutOfMemoryError紓困,如果您的處理范圍如此之大的話。

請注意,使用range[Closed]構造的流可能比使用Stream.iterate構造的流更有效。

你可以做這樣的事情

    AtomicInteger counter = new AtomicInteger(0);

    Stream<Integer> s = Stream.generate(() -> counter.getAndIncrement());

暫無
暫無

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

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