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() 在并行流與順序流之間進行切換。