主要內容
- Stream流
- 方法引用
1 Stream流
JDK1.8+出現,關注做什麼,而不是怎麼做
1.1 流程式思想
- 對一組數據進行多過濾,篩選,統計…
- Stream流並不會存儲元素,流對象只能被消費一次
- 只能內部迭代遍歷
- Stream流是一個來自數據源的元素隊列並支持聚合操作
- 數據源:可以是集合或數組等等.
1.2 獲取流
Collection集合都可以通過stream默認方法獲取流 List<String> list = new ArrayList<>(); Stream<String> stream1 = list.stream(); Stream接口靜態方法of可以獲取數組對應的流 String[] array = { "張無忌", "張翠山", "張三丰", "張一元" }; Stream<String> stream = Stream.of(array);
of方法的參數是一個可變參數,所以支持數組
1.3 常用方法
- 延遲方法:返回值類型仍然是Stream自身,支持鏈式調用
過濾:fiter Stream<T> filter(Predicate<? super T> predicate) 映射(轉換):map <R> Stream<R> map(Function<? super T, ? extends R> mapper); 取用前幾個:limit Stream<T> limit(long maxSize); 跳過前幾個:skip Stream<T> skip(long n); 組合:concat static <T> Stream<T> concat(Stream<? extends T> a,Stream<? extends T> b)
- 終結方法:返回值不再是Stream,不支持鏈式,相當於流水線的開關。
遍歷:forEach void forEach(Consumer<? super T> action) 統計個數:count long count();
- 擴展
將元素存儲到數組 String[] str = Stream.of().toArray(String[]::new) 將元素存儲到集合 List<T> list = Stream.of().collect(Collectors.toList());
2 方法引用
- 如果Lambda表達式僅僅是調用一個已經存在的方法, 那就可以通過方法引用來替代Lambda表達式
作用
::簡化Lambda表達式
::
:方法引用運算符, 它所在的表達式被稱爲方法引用- Lambda表達式寫法:
(String s) -> System.out.println(s)
參數傳遞給System.out.println()方法去打印- 方法引用寫法:
System.out::println
用System.out.println()方法中代碼, 來作爲Lambda中重寫方法的實現方式
注意:
Lambda中傳遞的參數一定是方法引用中的那個方法可以接收的類型,否則會拋出異常
方法引用能簡化以下場景: (方法名後不要寫小括號)
- 通過對象名引用成員方法
對象名::成員方法名
System.out::println- 通過類名引用靜態方法
類名::靜態方法名
i -> Math.abs(i)
Math::abs- 通過super引用父類成員方法
super::父類方法名
()->super.eat();
super::eat- 通過this引用本類成員方法
this::本類方法名
()->this.eat();
this::eat- 引用某個類的構造方法
類名::new
name->new Person(name)
Person::new- 引用創建數組的方法
數據類型[]::new
length->new int[length];
int[]::new