1. 程式人生 > >[三]java8 函數語言程式設計Stream 概念深入理解 Stream 執行原理 Stream設計思路

[三]java8 函數語言程式設計Stream 概念深入理解 Stream 執行原理 Stream設計思路

這些流的方法是如何實現的?
類StreamSupport提供了許多用於建立流的低階方法,所有這些方法都使用某種形式的Spliterator.
一個Spliterator.是迭代器Iterator的並行版本
它描述了一個(可能是無限的)元素集合,支援順序前進、批量遍歷,並將一部分輸入分割成另一個可並行處理的Spliterator 在最低層,所有的流都由一個spliterator 構造(所以說流就是迭代器的一種高階形式)

在實現Spliterator時,有許多實現選擇,幾乎所有的實現都是在簡單的實現和使用Spliterator流的執行時效能之間進行權衡。建立Spliterator的最簡單、但最不高效能的方法是,使用Spliterators.spliteratorUnknownSize(java.util.Iterator, int).雖然這樣的Spliterator可以工作,但它很可能提供糟糕的並行效能,因為我們已經丟失了尺寸資訊(底層資料集有多大),並且被限制為一個簡單的分割演算法。

一個高質量的Spliterator將提供平衡的和知道大小的分割,精確的尺寸資訊,以及一些可用於實現優化執行的spliterator 或資料的 characteristics (見Spliterator int characteristics()  )

可變資料來源的Spliterators有一個額外的挑戰;
繫結到資料的時間,因為資料可能在建立spliterator的時間和執行流管道的時間之間發生變化。理想情況下,一個流的spliterator 應該報告一個characteristic of IMMUTABLE or CONCURRENT;
如果不是,應該是後期繫結。如果一個源不能直接提供一個推薦的spliterator,它可能會間接地通過Supplier提供一個spliterator,通過接收Supplier作為引數的stream方法構建一個流