- 概述
- Stream API(java.util.stream.*)
- Stream 是 Java8 中處理集合的關鍵抽象概念,它可以指定你希望對集合進行的操作,可以執行非常複雜的查找、過濾和映射數據等操作。
- 使用Stream API 對集合數據進行操作,就類似於使用 SQL 執行的數據庫查詢。也可以使用 Stream API 來並行執行操作。
- Stream API 提供了一種高效且易於使用的處理數據的方式
- 什麼是Stream
- 是數據渠道,用於操作數據源(集合、數組等)所生成的元素序列
- 集合講的是數據,流講的是計算
- 注意
- Stream 自己不會存儲元素。
- Stream 不會改變源對象。相反,他們會返回一個持有結果的新Stream。
- Stream 操作是延遲執行的。這意味着他們會等到需要結果的時候才執行。
- 操作步驟
- 創建stream
- 一個數據源(如: 集合、數組), 獲取一個流
- Java8 中的 Collection 接口被擴展,提供了兩個獲取流的方法
- default Stream<E> stream() : 返回一個順序流
- default Stream<E> parallelStream() : 返回一個並行流
-
//1.Collection提供了兩個方法stream()與parallelStream() List<String>list=newArrayList<>(); Stream<String>stream=list.stream();//獲取一個順序流 Stream<String>parallelStream=list.parallelStream();//獲取一個並行流 //2.通過Arrays中的stream()獲取一個數組流 Integer[]nums=newInteger[10]; Stream<Integer>stream1=Arrays.stream(nums); //3.通過Stream類中靜態方法of() Stream<Integer>stream2=Stream.of(1,2,3,4,5,6); //4.創建無限流 //迭代 Stream<Integer>stream3=Stream.iterate(0,(x)->x+2).limit(10); stream3.forEach(System.out::println); //生成 Stream<Double>stream4=Stream.generate(Math::random).limit(2); stream4.forEach(System.out::println);
- 中間操作
- 一箇中間操作鏈,對數據源的數據進行處理
- 多箇中間操作可以連接起來形成一個流水線,除非流水線上觸發終止操作,否則中間操作不會執行任何的處理!而在終止操作時一次性全部處理,稱爲“惰性求值”
- 篩選與切片
-
/* 篩選與切片 filter——接收Lambda,從流中排除某些元素。 limit——截斷流,使其元素不超過給定數量。 skip(n)——跳過元素,返回一個扔掉了前n個元素的流。若流中元素不足n個,則返回一個空流。與limit(n)互補 distinct——篩選,通過流所生成元素的hashCode()和equals()去除重複元素 */ //內部迭代:迭代操作StreamAPI內部完成 @Test publicvoidtest2(){ //所有的中間操作不會做任何的處理 Stream<Employee>stream=emps.stream() .filter((e)->{ System.out.println("測試中間操作"); returne.getAge()<=35; }); //只有當做終止操作時,所有的中間操作會一次性的全部執行,稱爲“惰性求值” stream.forEach(System.out::println); } //外部迭代 @Test publicvoidtest3(){ Iterator<Employee>it=emps.iterator(); while(it.hasNext()){ System.out.println(it.next()); } }
-
- 映射
-
映射
map——接收Lambda,將元素轉換成其他形式或提取信息。接收一個函數作爲參數,該函數會被應用到每個元素上,並將其映射成一個新的元素。
flatMap——接收一個函數作爲參數,將流中的每個值都換成另一個流,然後把所有流連接成一個流
-
- 排序
- 終止操作
- 概述:
- 一個終止操作,執行中間操作鏈,併產生結果
- 查找與匹配
- 終端操作會從流的流水線生成結果。其結果可以是任何不是流的值,例如: List、 Integer,甚至是 void
-
allMatch——檢查是否匹配所有元素 anyMatch——檢查是否至少匹配一個元素 noneMatch——檢查是否沒有匹配的元素 findFirst——返回第一個元素 findAny——返回當前流中的任意元素 count——返回流中元素的總個數 max——返回流中最大值 min——返回流中最小值
- 歸約
- 收集
-
collect——將流轉換爲其他形式。接收一個Collector接口的實現,用於給Stream中元素做彙總的方法
-
- 概述:
- 創建stream
- 並行流與串行流
- 並行流:把每一個內容分成多個數據塊,並用不用的線程分別處理每個數據塊的流
- 瞭解Fork/join 框架
- Fork/Join框架:就是在必要的情況下,將一個大任務,進行拆分(fork)成若干個小任務(拆到不可再拆時),再將一個個的小任務運算的結果進行join彙總。
- Fork/Join框架與傳統線程池的區別