Java8 Stream API 詳細使用指南

福利

如今關注微信公衆號:碼農小胖哥, 發送關鍵字【抽獎】進行抽獎,可有機會獲取實體編程書籍。活動只剩下2天了抓緊參與!【本次抽獎截止到本週末】java

1. 概述

Java 8 引入的一個重要的特性無疑是 Stream API。Stream 翻譯過來是「流」,忽然想到的是大數據處理有個流式計算的概念,數據經過管道通過一個個處理器(Handler)進行篩選,聚合,並且流都具備向量性,強調的是對數據的計算處理,而集合強調的是數據集。Stream能夠看作是一個可操做的數據集序列,它能夠指定你但願對集合進行的操做,能夠執行很是複雜的查找、過濾和映射數據等操做。有點相似於數據庫中的增刪改查操做。十分高效並且易於使用。數據庫

2. 建立Stream

從不一樣的數據源建立流有不少方式。 被建立的流並不能改變數據源。什麼意思呢?打個比方,從一個集合建立流後,對流的操做並不會改變這個集合的數據狀態。咱們仍是舉個例子吧。編程

file

如上圖, 咱們將一個長度爲3的集合放入一個流,過濾掉元素長度不超過4的元素,而後把剩下的迭代出來。同時咱們還打印一下原始的數據源strArr集合長度看看是否發生了變化。結果雖然從流中移除了java這個元素可是strArr卻並無變化。數組

file

接下來咱們開始梳理一下建立流的方式。微信

2.1 空流

file

你應該注意到上圖中我用Collections 建立了一個空的List,流也是同樣,並且這二者的意義也是同樣的。都是避免爲沒有元素而返回null框架

2.2 從集合建立流

file

上面摘自java 8 Collection 說明只要是 Collection 的實現均可以建立流。 dom

file

2.3 從數組建立流

咱們能夠從數組來建立一個流,或者從數組中按照索引截取一部分建立流函數

file

2.4 經過構造器建立流

Stream 提供建造者方法來構建流。不過請注意泛型約束,不然返回的是Object類型的流。大數據

file

2.5 無限流

generate() 方法接收 Supplier 函數來生成元素,並且生成若是不加以限制將不會中止,直到內存限制。下面這個例子將生成長度爲10,字符串元素長度爲5的字符串流編碼

file

建立無限流的另外一種方法是使用iterate() 方法。和generate() 方法同樣都要加以限制。不一樣的是iterate()方法第一個參數做爲起始的種子,第二個函數參數來定製生成元素的規則。下面這個例子是從1做爲第一個元素,每一個元素在上一個元素的基礎上加1,限制長度爲10。下面將打印1-10。

file

2.6 基本類型流

Java 8提供了從三種基本類型建立流的可能性:int,long和double。因爲Stream 是一個通用接口,而且沒法使用基本類型做爲泛型的類型參數,所以建立了三個新的特殊接口: IntStreamLongStreamDoubleStream

使用這些新的API避免了沒必要要的自動裝箱,從而提升了生產率:

file

以上兩個方法的起始都是從1開始,步長爲1建立序列。區別就是endExclusive=3range方法不包含3,而rangeClosed包括3。

從Java 8開始,Random類爲生成基本類型流提供了普遍的方法。例如,如下代碼建立一個DoubleStream,它有三個隨機double元素:

file

2.7 字符串流

String也能夠用做建立流的源。藉助String類的chars()方法。因爲沒有CharStream,在JDK的IntStream用於表示字符流代替。

file

如下示例根據指定的RegExString拆分爲子字符串:

file

2.8 文件流

Java NIO類Files容許經過lines()方法生成文本文件的Stream 。文本的每一行都成爲流的一個元素:

file

你還能夠在lines() 方法中指定字符集編碼。

2.9 並行流

並行流就是把一個內容分紅多個數據塊,並用不一樣的線程分紅多個數據塊,並用不一樣的線程分別處理每一個數據塊的流。底層用了Fork/Join框架。該流主要用來處理大批量的數據源。少許數據不建議使用。帶有parallel的聲明方式都是並行流,這裏不在介紹。

可是使用必定要注意數據並行處理同步。要麼使用同步集合,諸如Collections.synchronized系列。或者在並行流收集元素到集合中時,調用collect方法,必定不要採用Foreach方法或者map方法。

3.流的引用

只要只調用中間操做,就能夠實例化一個流並具備對它的可訪問引用。執行終端操做會使流不可訪問。從技術上講,如下代碼看上去是有效的:

file

第3行是終端操做 若是接着執行第4行對stream進行重用將觸發IllegalStateException。必定要謹記 Java 8 中同一個Stream 在終端操做後是不能重用的。 正確的作法是這樣的:

file

4.流的中間操做

中間操做就是對數據源中的數據的計算操做。其實上面咱們已經對流進行不少的中間操做好比filter()limit()等等。網上很著名的一些中間操做講解

file

file

file

filefilefile

5.流的生命週期

建立Stream 一個數據源(如:集合、數組),獲取一個流中間操做 一箇中間操做鏈,對數據源的數據進行處理終止操做(終端操做)一個終止操做,執行中間操做鏈,併產生結果,到此整個流消亡。

6.總結

Java 8 Stream 具備里程碑的意義。改變了以往對數據處理的模式。經過本篇對流以及流的生命週期都作了詳盡的說明。相信你已經可以經過Stream來提升你的開發效率。

關注公衆號:碼農小胖哥,獲取更多資訊

相關文章
相關標籤/搜索