1、簡介Streamjava
Java8中有兩大最爲重要的改變。第一個是 Lambda 表達式;另一 個則是 Stream API(java.util.stream.*)。Stream 是 Java8 中處理集合的關鍵抽象概念,它能夠指定你但願對集合進行的操做,能夠執行很是複雜的查找、過濾和映射數據等操做。使用Stream API 對集合數據進行操做,就相似於使用 SQL 執行的數據庫查詢。也可使用 Stream API 來並行執行操做。簡而言之,Stream API 提供了一種高效且易於使用的處理數據的方式。
2、什麼是Stream
流(Stream) 究竟是什麼呢?
是數據渠道,用於操做數據源(集合、數組等)所生成的元素序列。「集合講的是數據,流講的是計算!」git
注意:github
(1)Stream 本身不會存儲元素。
(2)Stream 不會改變源對象。相反,他們會返回一個持有結果的新Stream。數組
(3)Stream 操做是延遲執行的。這意味着他們會等到須要結果的時候才執行。網絡
3、Stream 的操做三個步驟ide
No.1 Stream函數
一、建立 Streamspa
一個數據源(如:集合、數組),獲取一個流對象
Java8 中的 Collection 接口被擴展,提供了 兩個獲取流的方法:
default Stream<E> stream() : 返回一個順序流
default Stream<E> parallelStream() : 返回一個並行流排序
二、由數組建立流
Java8 中的 Arrays 的靜態方法 stream() 可 以獲取數組流:
static <T> Stream<T> stream(T[] array): 返回一個流
重載形式,可以處理對應基本類型的數組:
public static IntStream stream(int[] array)
public static LongStream stream(long[] array)
public static DoubleStream stream(double[] array)
三、由值建立流
可使用靜態方法 Stream.of(), 經過顯示值 建立一個流。它能夠接收任意數量的參數。
public static<T> Stream<T> of(T... values) : 返回一個流
四、由函數建立流:建立無限流
可使用靜態方法 Stream.iterate() 和 Stream.generate(), 建立無限流。迭代
public static<T> Stream<T> iterate(final T seed, final UnaryOperator<T> f)
生成
public static<T> Stream<T> generate(Supplier<T> s) :
No.2 Stream
一、中間操做
一箇中間操做鏈,對數據源的數據進行處理
二、Stream 的中間操做
多箇中間操做能夠鏈接起來造成一個流水線,除非流水 線上觸發終止操做,不然中間操做不會執行任何的處理! 而在終止操做時一次性所有處理,稱爲「惰性求值」。
篩選與切片
方法 | 描述 |
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) | 產生一個新流,其中按比較器順序排序 |
一個終止操做,執行中間操做鏈,併產生結果
二、終端操做會從流的流水線生成結果。其結果能夠是任何不是流的 值,例如:List、Integer,甚至是 void 。
查找與匹配
方法 | 描述 |
allMatch(Predicate p) | 檢查是否匹配全部元素 |
anyMatch(Predicate p) | 檢查是否至少匹配一個元素 |
noneMatch(Predicate p) | 檢查是否沒有匹配全部元素 |
findFirst() | 返回第一個元素 |
findAny() | 返回當前流中的任意元素 |
count() | 返回流中元素總數 |
max(Comparator c) | 返回流中最大值 |
min(Comparator c) | 返回流中最小值 |
forEach(Consumer c) | 內部迭代(使用 Collection 接口須要用戶去作迭 代,稱爲外部迭代。相反,Stream API 使用內部 迭代——它幫你把迭代作了) |
歸約
reduce(T iden, BinaryOperator b) | 能夠將流中元素反覆結合起來,獲得一個值。 返回 T |
reduce(BinaryOperator b) | 能夠將流中元素反覆結合起來,獲得一個值。 返回 Optional<T> |
備註:
map 和 reduce 的鏈接一般稱爲 map-reduce 模式,因 Google 用它 來進行網絡搜索而出名。
收集
方法 | 描述 |
collect(Collector c) | 將流轉換爲其餘形式。接收一個 Collector接口的 實現,用於給Stream中元素作彙總的方法 |
Collector 接口中方法的實現決定了如何對流執行收集操做(如收集到 List、Set、Map)。可是 Collectors 實用類提供了不少靜態方法,能夠方便地建立常見收集器實例。