java基礎之 java8 新增的Stream流 v2

 

Java基礎之Java8 新增的lamdba表達式入門與簡單示例
Stream類圖

public interface BaseStream<T, S extends BaseStream<T, S>>
        extends AutoCloseable {
    .....
}



流操作包含三件事:

  1. 數據源: 如集合 數組等
    1. stream.of()
    2. Arrays.aslist()
    3. Arraylist<>();
  2. 中間操作鏈: 鏈式操作 比如我們對一個水果集合篩選 篩選重量 篩選顏色 篩選品相 篩選原產地等 [值得一提的一點,中間的操作返回值都是流,而且如果沒有終端操作這些中間操作鏈是不會執行的]
  3. 終端操作: 最終得到我們所需的結果

java8 新增了Stream、IntStream、LongStream、DoubleStream等流式API,這些API 代表多個支持串行和並行聚集操作的元素。

  1. Stream --- 通用流接口
  2. IntStream --- int
  3. DoubelStream --- long
  4. LongStream --- double

每個流式Api都有一個builder方法;

Stream步驟:

  1. Stream或XxxStream的builder()類方法創建該Stream對應的Builder;
  2. 重複調用Builder的add() 方法向該流添加多個元素
  3. 調用Builder的build()方法獲取對應的Stream
  4. 調用Stream的聚集方法【根據業務情況調用不同的聚集方法】

Stream 方法:

  • 兩類【顧名思義】
    • 中間方法:中間操作,與末端方法不同,後面依舊可以調用後續的方法,流依舊是打開的狀態
    • 末端方法:末端操作,使用完流就關閉了。和字節輸入輸入流的close方法性質類似;
  • 兩個特徵
    • 有狀態的方法:
      • 給流添加一些新的屬性
      • 需要較大的開銷
    • 短路方法: 可以儘早的結束流,不必進行所有元素的檢查
  • 常見中間方法:
    • filter(predicate p) 過濾不符合p的元素
    • mapToXxx(ToXxxFunction mapper): 使用mapper對流中的元素進行轉換。返回轉換後的元素;
    • peek(Consumer action) 一次對每個元素執行一些操作,該方法返回的流與原有流包含相同的元素,該方法主要用於測試;
    • distinct():  是不是很眼熟,寫SQL的時候常見吧。排除流中重複的元素。(利用equals進行判斷元素是否相同)
    • sorted():排序,是流中的元素處於有序的狀態。切記排序的時候常用與可以排序的,不是所有流都可以用。例如你自己Student的集合是沒法排序的,強行使用會報轉換異常
    • limit(long maxSize): 看起來又好眼熟【Sql】,用戶保證對流的後續訪問中最大允許訪問的元素個數。這是一個有狀態的、短路方法;
  • 常用的末端方法:
    • ForEach(Consumer action): 遍歷流中所有元素,對每個元素執行action
    • toArray(): 將流中所有元素轉換爲一個數組
    • reduce(): 該方法有3個重載的版本,都用於某種操作來合併流中的元素。
    • min(): 返回流中所有元素的最小值
    • max(): 返回流中所有元素的最大值
    • count():返回流中所有元素的個數
    • anyMatch(predicate p): 判斷流中是否至少有一個元素符合P條件
    • allMatch(predicate p): 判斷流中是否至每個元素符合P條件
    • noneMatch(predicate p): 判斷流中時候所有元素都不符合P條件
    • findFirst(): 返回流中的第一個元素
    • finAny(): 隨機返回流中的一個元素
    • collect(): 把流歸約成一個集合

java8 在Collection接口提供了一個Stream()默認方法,該方法可以返回集合對應的流。

 

 

 

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章