本文記錄一些java8的stream和jdk9的reactive stream中的一些知識點(diǎn)。
不定期更新。
map和flatMap
| map | flatMap | |
|---|---|---|
| 輸出元素個(gè)數(shù) | 1個(gè) | 0~N個(gè) |
| 輸出類型 | 原類型 | list |
| 適用場景 | 轉(zhuǎn)換數(shù)據(jù) | 對數(shù)據(jù)操作 |
在spring webflux中,與Mono和Flux有關(guān)的操作,優(yōu)先選擇flatMap。
舉個(gè)例子,下面有map和flatMap分別處理這個(gè)string[]的list:
List<String[]> eggs = new ArrayList<>();
// 第一箱雞蛋
eggs.add(new String[]{"雞蛋_1", "雞蛋_1", "雞蛋_1", "雞蛋_1", "雞蛋_1"});
// 第二箱雞蛋
eggs.add(new String[]{"雞蛋_2", "雞蛋_2", "雞蛋_2", "雞蛋_2", "雞蛋_2"});
//打印出兩個(gè)stream
eggs.stream()
.map(x -> Arrays.stream(x)).forEach(x-> System.out.println(x));
//打印出每一個(gè)雞蛋的名稱
eggs.stream()
.flatMap(x -> Arrays.stream(x)).forEach(x-> System.out.println(x));
輸出的結(jié)果:
java.util.stream.ReferencePipeline$Head@28a0fd6c
java.util.stream.ReferencePipeline$Head@2b62442c
雞蛋_1
雞蛋_1
雞蛋_1
雞蛋_1
雞蛋_1
雞蛋_2
雞蛋_2
雞蛋_2
雞蛋_2
雞蛋_2
stream和parallelStream
stream稱為流,parallelStream是并行流。在使用parallelStream時(shí),要注意所涉及的變量都是無狀態(tài)的,不要有類級別的屬性變量。否則會出現(xiàn)結(jié)果不正確,而stream的效率是很低的。比如是循環(huán)的話,一般的優(yōu)先級排序:parallelStream>foreach>stream。
當(dāng)然,某些情況下,遍歷的內(nèi)容不大,或者說為了追求理解能力而想使用流式編程,此時(shí)的stream的優(yōu)先級提高。