Day 29
1. Stream 流
1.1 引入
Stream 流不是I/O流,按照流水線處理方式來考慮代碼中的思想。
JDK1.8 之後,我們擁有了Lambda表達式,讓代碼的中心偏向解決實際問題,直到重點,可以提高效率。
Stream流中使用了大量Lambda表達式,利用Lambda操作方式,提供開發效率
1.2 傳統遍歷方式和Stream流方式
Stream流更傾向於重點
1.3 Stream流對應的思想
流水線
原材料從頭到尾只會佔用一份空間,中間的過程中不會佔用空間,最後生成一個結果。
Stream流有一些特徵:
1. 帶有很多Stream流操作的方法,filter、limit、map、sorted、skip...這些方法大多是都會使用到函數式接口,有Lambda表達式
2. 整個Stream流模型造作過程中,只有執行到count,foreach等方法,操作真正的執行中的模型,如果不存在結果嚮導,中間的所有操作是無效的,這裏得益於Lambda表達式的延後性。
3. Stream流是存在一定的管道性Pipelining流水線
1.4 獲取Stream流
java.util.stream.Stream<T> JDK1.8新特徵
1. 所有的Collection<T>集合都有對應的stream();
2. 可以通過Stream類中的static Stream of() 獲取
static Stream<T> of(T... t);
static Stream<T> of(T t);
1.5 Stream常用方法
延遲方法
返回值類型依然是Stream接口,沒有允許我們操作真正的資源
允許鏈式操作
終結方法
返回類型不是Stream接口本身,要麼處理數據,要麼返回其他類型數據,
不再支持鏈式操作
count、foreach
1.5.1 foreach方法【終結方法】
void foreach(Cunsumer<? super T> action);
1.5.2 filter方法
Stream<T> filter(Predicate<? super T> filter);
1.5.3 map方法
<R> Stream<R> map(Function<? super T, ? super R> fun);
1.5.4 count方法 【終結方法】
long count();
1.5.5 limit方法
Stream<T> limit(long maxSize);
1.5.6 skip 方法
Stream<T> skip(long n);
1.5.7 concat方法
static Stream<T> concat(Stream<? extends T> stream1,Stream<? extends T> stream2);
1.5.8 原始操作方式和Stream流操作方式對比
1. 一個String類型的字符串集合
2. 過濾,得到包含5的數據
3. 跳過前三個數據
4. 限制得到前5個數據
5. 兩個String類型集合字符串合併
6. 轉換成Person類型
7. 展示
2. 方法引用
2.1 Lambda冗餘問題以及方法引用初識
2.2 方法引用小要求
testPrint("鄭州加油!!!", str -> System.out.println(str));
testPrint("鄭州加油!!!", System.out::println);
1. 明確對象
對象 ==> 調用者
類對象,類名,super,this,構造方法,數組構造方法
2. 明確的執行方法
該方法只有名字不需要顯式出現參數
3. 需要處理的數據
【聯想,推導,省略】
4. :: 方法引用格式
2.3 通過類對象執行方法引用
1. 明確對象
類對象
2. 明確執行的方法
自定義
3. 處理的數據
簡單要求爲String類型
2.4 通過類名執行方法引用
2.5 通過super關鍵字執行方法引用
2.6 通過this關鍵字執行方法引用