【Java8精华教程】一起爪哇Java8——好用的Stream
2019獨角獸企業重金招聘Python工程師標準>>>
Stream組成
在傳統Java編程,或者說是類C語言編程中,我們如何操作一個數組數據呢?或者更泛化的講,我們如何操作一個“集合”(Collection)數據呢?在Java中我們利用java.util包里的各種數據結構封裝,來很好的表示了數組(Array)、集合(Set)、列表(List)和kv對象(Map)。但是抽象表示只是意味著存儲和定義操作方法,具體如何訪問中間的數據,其實還是比較原始的,或者換句話說,操作一個Collection的數據,我們使用的是Collection本身提供的API。就如我們訪問一個List里的所有數據,需要一個for循環來get每個element。
Java 8引入了一個Stream對象,來重新封裝集合中的數據,就像集合根據其特定的數據結構存儲了數據,而Stream將其表示為一個數據流,一個類似List的有序的數據流。值得一提的是,Stream是不存儲數據的,它核心是要將不同的數據——流化。
Stream包含一個*數據源頭*(Source),一組(0個或多個)*中間操作*和一個*終止操作*。其實很好理解,一個流一定需要一個數據*源頭*,畢竟要確定是哪些數據要流式處理。*中間操作*是一些類似map、filter之類的轉換操作,也就是說map和filter只是將一個流變為新的流,它們可以串起來(stream pipeline)。而*終止操作*顧名思義,*終止操作*會結束流,*終止操作*包括產出結果型和邊際效果型(side-effect),其中前者比如count之類的產出一個int值的,后者則是forEach之類的允許后續處理的。下面具體分開講解一下Stream的各個組成部分。
源頭(Source)
其中源頭來源于數組、Collection、I/O資源和生成函數。
Arrays
通過一個數組生成一個流,是比較容易理解的。Java API也是通過Arrays.stream()方法來實現的:
public static <T> Stream<T> stream(T[] array, int startInclusive, int endExclusive) {return StreamSupport.stream(spliterator(array, startInclusive, endExclusive), false);}看其聲明就是將一個數組轉換為一個Stream對象。其委托StreamSupport來構造,而StreamSupport的stream方法聲明如下:
public static <T> Stream<T> stream(Spliterator<T> spliterator, boolean parallel) {Objects.requireNonNull(spliterator);return new ReferencePipeline.Head<>(spliterator,StreamOpFlag.fromCharacteristics(spliterator),parallel);}這里一個很重要的參數是Spliterator,這是構造流的核心。ReferencePipeline.Head構造方法就是將一些屬性設置好。而ReferencePipeline是個重要的概念,它是pipeline里對于*中間操作*和*源頭*實現的抽象類,從其類聲明中可以看出:
abstract class ReferencePipeline<P_IN, P_OUT>extends AbstractPipeline<P_IN, P_OUT, Stream<P_OUT>>implements Stream<P_OUT> {}兩個泛型表示了pipeline的輸入和輸出。*中間操作*的實現很多也是由其實現的,比如map和filter。回到剛才的分析,因為ReferencePipeline構造后沒有后續的方法鏈調用了。所以要理解的就是Spliterator這個東西是什么。
閱讀全文直接點擊:http://click.aliyun.com/m/9890/
轉載于:https://my.oschina.net/u/3161071/blog/832558
總結
以上是生活随笔為你收集整理的【Java8精华教程】一起爪哇Java8——好用的Stream的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: HTML5音乐播放器(四):播放列表与播
- 下一篇: WebGIS中地图恢复初始位置及状态