4.JDK1.8特性之Stream API


1.什么是stream

2.stream的三個步驟

3.stream的創(chuàng)建

4.stream的中間操作

5.stream的終止操作

6.?并行流與串行流


1.什么是stream

Stream 是 Java8 中處理集合的關鍵抽象概念,它可以指定你希望對集合進行的操作,可以執(zhí)行非常復雜的查找、過濾和映射數據等操作。使用Stream API 對集合數據進行操作,就類似于使用 SQL 執(zhí)行的數據庫查詢。也可以使用 Stream API 來并行執(zhí)行操作。簡而言之,Stream API 提供了一種高效且易于使用的處理數據的方式。

流(Stream) 到底是什么呢?是數據渠道,用于操作數據源(集合、數組等)所生成的元素序列?!凹现v的是數據,流講的是計算!”

注意:

①Stream 自己不會存儲元素。

②Stream 不會改變源對象。相反,他們會返回一個持有結果的新Stream。

③Stream 操作是延遲執(zhí)行的。這意味著他們會等到需要結果的時候才執(zhí)行。

2.stream的三個步驟

2.1 創(chuàng)建 Stream

一個數據源(如:集合、數組),獲取一個流

2.2 中間操作

一個中間操作鏈,對數據源的數據進行處理

2.3 終止操作(終端操作)

一個終止操作,執(zhí)行中間操作鏈,并產生結果


3.stream的創(chuàng)建

Java8 中的 Collection 接口被擴展,提供了兩個獲取流的方法

default Streamstream() : 返回一個順序流

default Stream parallelStream() : 返回一個并行流

由數組創(chuàng)建流Java8 中的 Arrays 的靜態(tài)方法 stream() 可以獲取數組流:

?staticStream stream(T[] array): 返回一個流

重載形式,能夠處理對應基本類型的數組:

public static IntStream stream(int[] array)

?public static LongStream stream(long[] array)

public static DoubleStream stream(double[] array)

由值創(chuàng)建流可以使用靜態(tài)方法 Stream.of()

通過顯示值創(chuàng)建一個流。它可以接收任意數量的參數。

public staticStream of(T... values) : 返回一個流

由函數創(chuàng)建流

創(chuàng)建無限流可以使用靜態(tài)方法 Stream.iterate() 和Stream.generate(), 創(chuàng)建無限流。

迭代public staticStreamiterate(final T seed, finalUnaryOperatorf)

?生成public staticStreamgenerate(Supplier s) :?

4.stream的中間操作

多個中間操作可以連接起來形成一個流水線,除非流水線上觸發(fā)終止操作,否則中間操作不會執(zhí)行任何的處理!而在終止操作時一次性全部處理,稱為“惰性求值”。


篩選與切片? ? ??


?方 法?? ?????????????????????????????????????描 述

filter(Predicate p)? ? ? ? ? ? ? ? ? ?????????????????????????????接收 Lambda , 從流中排除某些元素。

distinct()? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?????????????????????????????篩選,通過流所生成元素的 hashCode() 和 equals() 去除重復元素

limit(long maxSize)? ? ? ? ? ? ? ????????????????????????????? 截斷流,使其元素不超過給定數量。

skip(long n)? ? ? ? ? ? ? ? ? ? ? ? ? ? ????????????????????????????跳過元素,返回一個扔掉了前 n 個元素的流。若流中元素不足 n 個,則返回一個空流。與 limit(n) 互補




映射?


方 法? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 描 述

map(Function f)? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 接收一個函數作為參數,該函數會被應用到每個元素上,并將其映射成一個新的元素。

mapToDouble(ToDoubleFunction f)? ? ? ? ? ? ? ? ? ?接收一個函數作為參數,該函數會被應用到每個元素上,產生一個新的 DoubleStream。

mapToInt(ToIntFunction f)? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 接收一個函數作為參數,該函數會被應用到每個元素上,產生一個新的 IntStream。

mapToLong(ToLongFunction f)? ? ? ? ? ? ? ? ? ? ? ? ? 接收一個函數作為參數,該函數會被應用到每個元素上,產生一個新的 LongStream。

flatMap(Function f)? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 接收一個函數作為參數,將流中的每個值都換成另一個流,然后把所有流連接成一個流



排序


方 法? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?描 述

sorted() ????????????????????????????????????????????????????????????????????????????????產生一個新流,其中按自然順序排序

sorted(Comparator comp) ????????????????????????????????????????????????????產生一個新流,其中按比較器順序排序



5.stream的終止操作

終端操作會從流的流水線生成結果。其結果可以是任何不是流的值,例如:List、Integer,甚至是 void 。


查找與匹配

方 法? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 描 述

allMatch(Predicate p)? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?檢查是否匹配所有元素

anyMatch(Predicate p) ????????????????????????????????????????????????????????????????????檢查是否至少匹配一個元素

noneMatch(Predicate p) ????????????????????????????????????????????????????????????????????檢查是否沒有匹配所有元素

findFirst() ????????????????????????????????????????????????????????????????返回第一個元素終端操作會從流的流水線生成結果。其結果可以是任何不是流的值,例如:List、Integer,甚至是 void 。

findAny() ????????????????????????????????????????????????????????????????????????????????????????????????返回當前流中的任意元素

count()? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?返回流中元素總數

max(Comparator c)? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?返回流中最大值

min(Comparator c) ????????????????????????????????????????????????????????????????????????????????????????返回流中最小值

reduce(T iden, BinaryOperator b)? ? ? ? ? ? ? ? ?可以將流中元素反復結合起來,得到一個值。返回 T歸約reduce(BinaryOperator b) 可以將流中元素反復結合起來,得到一個值。返回 Optional備注:map 和 reduce 的連接通常稱為 map-reduce 模式,因 Google 用它來進行網絡搜索而出名。

orEach(Consumer c)? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?內部迭代(使用 Collection 接口需要用戶去做迭代,稱為外部迭代。相反,Stream API 使用內部迭代——它幫你把迭代做了)



歸約

reduce(BinaryOperator b) 可以將流中元素反復結合起來,得到一個值。返回 Optional<T>


收集

collect(Collector c)? ? ? ? ? ? ? ? ? ? ? ? ? ??

將流轉換為其他形式。接收一個 Collector接口的實現,用于給Stream中元素做匯總的方法

Collector 接口中方法的實現決定了如何對流執(zhí)行收集操作(如收集到 List、Set、Map)。但是 Collectors 實用類提供了很多靜態(tài)方法,可以方便地創(chuàng)建常見收集器實例,具體方法與實例如下表:



6.?并行流與串行流

并行流就是把一個內容分成多個數據塊,并用不同的線程分別處理每個數據塊的流。Java 8 中將并行進行了優(yōu)化,我們可以很容易的對數據進行并行操作。Stream API 可以聲明性地通過 parallel() 與sequential() 在并行流與順序流之間進行切換。

?著作權歸作者所有,轉載或內容合作請聯系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容