Java基礎之Java8 新增的lamdba表達式入門與簡單示例
Stream類圖
public interface BaseStream<T, S extends BaseStream<T, S>>
extends AutoCloseable {
.....
}
流操作包含三件事:
- 數據源: 如集合 數組等
- stream.of()
- Arrays.aslist()
- Arraylist<>();
- 中間操作鏈: 鏈式操作 比如我們對一個水果集合篩選 篩選重量 篩選顏色 篩選品相 篩選原產地等 [值得一提的一點,中間的操作返回值都是流,而且如果沒有終端操作這些中間操作鏈是不會執行的]
- 終端操作: 最終得到我們所需的結果
java8 新增了Stream、IntStream、LongStream、DoubleStream等流式API,這些API 代表多個支持串行和並行聚集操作的元素。
- Stream --- 通用流接口
- IntStream --- int
- DoubelStream --- long
- LongStream --- double
每個流式Api都有一個builder方法;
Stream步驟:
- Stream或XxxStream的builder()類方法創建該Stream對應的Builder;
- 重複調用Builder的add() 方法向該流添加多個元素
- 調用Builder的build()方法獲取對應的Stream
- 調用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()默認方法,該方法可以返回集合對應的流。