1、Stream的使用場景。
Java8中有兩大最為重要的改變。第一個是 Lambda 表達式;另外一 個則是 Stream API(java.util.stream.*)。
Stream 是 Java8 中處理集合的關鍵抽象概念,它可以指定你希望對
集合進行的操作,可以執行非常復雜的查找、過濾和映射數據等操作。
使用Stream API 對集合數據進行操作,就類似於使用 SQL 執行的數
據庫查詢。也可以使用 Stream API 來並行執行操作。簡而言之,
Stream API 提供了一種高效且易於使用的處理數據的方式。
2、Stream三個操作步驟
創建 Stream
一個數據源(如:集合、數組),獲取一個流 中間操作
一個中間操作鏈,對數據源的數據進行處理 終止操作(終端操作)
一個終止操作,執行中間操作鏈,並產生結果。
3、創建Stream
public static<T> Stream<T> of(T... values) : 返回一個流
static <T> Stream<T> stream(T[] array): 返回一個流
4、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) 產生一個新流,其中按比較器順序排序。
5、Stream終止操作
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<T> 備注:map 和 reduce 的連接通常稱為 map-reduce 模式,因 Google 用它 來進行網絡搜索而出名。
forEach(Consumer c)
collect(Collector c) 將流轉換為其他形式。接收一個 Collector接口的 實現,用於給Stream中元素做匯總的方法
toList List<T> 把流中元素收集到List
List<Employee> emps= list.stream().collect(Collectors.toList()); toSet Set<T> 把流中元素收集到Set
Set<Employee> emps= list.stream().collect(Collectors.toSet()); toCollection Collection<T> 把流中元素收集到創建的集合
Collection<Employee>emps=list.stream().collect(Collectors.toCollection(ArrayList::new)); counting Long 計算流中元素的個數
long count = list.stream().collect(Collectors.counting()); summingInt Integer 對流中元素的整數屬性求和
inttotal=list.stream().collect(Collectors.summingInt(Employee::getSalary)); averagingInt Double 計算流中元素Integer屬性的平均 值 doubleavg= list.stream().collect(Collectors.averagingInt(Employee::getSalary)); summarizingInt IntSummaryStatistics 收集流中Integer屬性的統計值。 如:平均值