java lambda collect_45分钟学会Java8 - Lambda和Stream
Java11已出,Java8已是主流。
現在來一波操作,應該不會太遲(T_T)
注:本文持續更新 ^_^
1. 前言
本文主要介紹Java8的2大主要新特性lambda表達式和Stream API,2者提供了更高層次的抽象,簡化開發,提高生產效率。
2. Lambda表達式
2.1 初識Lambda表達式
創建一個線程,使用了一個Runnable匿名內部類
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
System.out.println("Hello Aron.");
}
});
看著問題不大,實際上弊端挺明顯:模板語法太多,真正有業務意義的的語句只有System.out.println("Hello Aron."),因為如此,也嚴重干擾了我們閱讀代碼。
引入lambda表達式后,則可以這么寫
Thread thread = new Thread(() -> System.out.println("Hello Aron."));
簡潔了太多,有木有?
2.2 更多Lambda表達式
Runnable runnable = () -> System.out.println("Hello World.");
Consumer tConsumer = bean -> System.out.println("Hello World.");
Runnable runnable1 = () -> {
System.out.println("Hello World.");
System.out.println("Hello World.");
};
語法分為3段式:參數 、-> 以及語句,即(...)-> { ...}
2.3 函數接口
Java是強類型語言,方法參數都有固定的類型。那么問題了,Lambda表達式,如果當做是一堆代碼片段,也會表達一種明確的意圖,這個意圖,姑且可以理解為函數接口。
在編程過程中,總會遇到很多函數接口,以下是JDK中一些比較最重要的函數接口
接口參數返回類型示例
接口
參數
返回類型
示例
Predicate
T
boolean
值等于“Hello”嗎?
Consumer
T
void
輸出一個值
Function
T
R
獲取對象的一個屬性
Supplier
None
T
工廠方法
UnaryOperator
T
T
邏輯非(!)
BinaryOperator
(T, T)
T
求2個數的和(+)
2.4 類型推斷
先看一段熟悉的集合代碼
ArrayList list = new ArrayList<>();
在ArrayList中申明了存儲的元素的類型,于是在ArrayList<>()這里的類型可以缺省,編譯器可以根據左側(即上文)推斷出來。
同理,在lambda表達式也是一樣的。
BinaryOperator addLongs = (x, y) -> x + y;
在上面的表達 式中,我們注意到 (x, y)這里是沒有申明方法的參數類型的,卻能執行數學運算 +。
這里根據函數接口指定的泛型類為Long,即可推斷方法的參數為Long,然后執行x + y。
2.5 Lambda小結
Lambda表達式是一個匿名方法,簡化了匿名內部類的寫法,把模板語法屏蔽,突出業務語句,傳達的更像一種行為。
Lambda表達式是有類型的,JDK內置了眾多函數接口
Lambda的3段式結構:(...)-> { ...}
3. Stream 流
3.1 簡介
流(Stream)是Java8的新特性,是一種使程序員得以站在更高的抽象層次上對集合進行操作。在思路上,類似于SQL的存儲過程,有幾個步驟:
先定義一些操作的集合,注意:這里只定義,不真正執行
觸發執行,獲取結果
對結果進一步處理,篩選、打印、使用
其中,第1步的定義操作叫惰性求值,給你套路(返回Stream),但是不會執行返回結果。
第2步的觸發操作叫及早求值,這個人說干就干,立馬要結果(返回結果數據)。
第3步的篩選類似SQL的where子句,對結果進一步的篩選。
3.2 Stream API
Stream 類位于java.util.stream包,是Java8核心的類之一,擁有眾多方法,下面羅列了一些比較重要的方法進行講解。更多的是拋磚引玉,任何教程都比不上自己的悟性來得爽快,先找點感覺,先掌握基本用法嘗試使用起來,慢慢自然就會了。
3.2.1 Stream.of(T… t)
要使用Stream,那就必須得先創建一個String類型的Stream
Stream StrStream = Stream.of("a", "b");
3.2.2 Stream.collect(Collector super T, A, R> collector)
使用收集器Collector將StrStream轉化為熟悉的集合Collection
List collect = StrStream.collect(Collectors.toList());
3.2.2 Stream.map(Function super T, ? extends R> mapper)
所謂map,從字面理解就是映射。這里指的是對象關系的映射,
比如從對象集合映射到屬性結合:
List names = Stream.of(new Student("zhangSan"), new Student("liSi"))
.map(student -> student.getName())
.collect(toList());
從小寫字母映射到大寫字母:
List collected = Stream.of("a", "b", "hello")
.map(string -> string.toUpperCase())
.collect(toList());
將 字符串流 根據空格分割成 字符串數組流
Stream stringStream = Stream.of("Hello Aron.");
Stream stringArrayStream = stringStream.map(word -> word.split(" "));
3.2.3 Stream.filter(Predicate super T> predicate)
filter顧名思義,過濾篩選。這里的參數函數接口是一個條件,篩選出滿足條件的元素
// 篩選年齡大于19的學生
List stu = Stream.of(new Student("zhangSan", 19), new Student("liSi"), 20)
.filter(student -> student.getAge() > 19)
.collect(toList());
3.2.4 Stream.flatMap(Function super T, ? extends Stream extends R>> mapper)
flatMap扁平化映射,即將數據元素為數組的Stream轉化為單個元素
Stream stringStream = Stream.of("Hello Aron.");
// 返回值為數組
Stream stringArrayStream = stringStream.map(word -> word.split(" "));
// flatMap扁平化映射后,元素都合并了
Stream flatResult = stringArrayStream.flatMap(arr -> Arrays.stream(arr))
3.2.5 Stream.max(Comparator super T> comparator)
max即最大,類似SQL中的函數max(),從數據中根據一定的條件篩選出最值
// 篩選年齡最大/小的學生
Stream studentStream = Stream.of(new Student("zhangSam", 19), new Student("liSi", 20));
Optional max = studentStream.max(Comparator.comparing(student -> student.getAge()));
// Optional max = studentStream.min(Comparator.comparing(student -> student.getAge()));
// 年齡最大/小的學生
Student student = max.get();
3.2.7 Sream.reduce(T identity, BinaryOperator binaryOperator)
reduce操作實現從一組值中生成一個值,上面的max、min實際上都是reduce操作。
參數Identity 表示初始值,
參數binaryOperator是一個函數接口,表示二元操作,可用于數學運算
// 使用reduce() 求和 (不推薦生產環境使用)
int count = Stream.of(1, 2, 3).reduce(0, (acc, element) -> acc + element);
上面代碼,展開reduce() 操作
BinaryOperator accumulator = (acc, element) -> acc + element;
int count = accumulator.apply( accumulator.apply(accumulator.apply(0, 1),2), 3);
3.2.8 綜合操作
// 查找所有姓張的同學并按字典順序排序,存儲到list
List newList = studentList.Stream()
.filter(student -> student.getName().startsWith("張"))
.sorted(Comparator.comparing(student -> student.getName())
.collect(toList());
覺得有用,記得收藏、點贊哦!
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的java lambda collect_45分钟学会Java8 - Lambda和Stream的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: kotlin 反射java类_关于Kot
- 下一篇: java master work_并发编