[英]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.