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