Java 8中Stream API的這些奇技淫巧!你都Get到了嗎?
Stream簡(jiǎn)介
1、Java 8引入了全新的Stream API。這里的Stream和I/O流不同,它更像具有Iterable的集合類,但行為和集合類又有所不同。
2、stream是對(duì)集合對(duì)象功能的增強(qiáng),它專注于對(duì)集合對(duì)象進(jìn)行各種非常便利、高效的聚合操作,或者大批量數(shù)據(jù)操作。
3、只要給出需要對(duì)其包含的元素執(zhí)行什么操作,比如 “過濾掉長(zhǎng)度大于 10 的字符串”、“獲取每個(gè)字符串的首字母”等,Stream 會(huì)隱式地在內(nèi)部進(jìn)行遍歷,做出相應(yīng)的數(shù)據(jù)轉(zhuǎn)換。
為什么要使用Stream
1、函數(shù)式編程帶來的好處尤為明顯。這種代碼更多地表達(dá)了業(yè)務(wù)邏輯的意圖,而不是它的實(shí)現(xiàn)機(jī)制。易讀的代碼也易于維護(hù)、更可靠、更不容易出錯(cuò)。
2、高端
實(shí)例數(shù)據(jù)源
Filter
1、遍歷數(shù)據(jù)并檢查其中的元素時(shí)使用。
2、filter接受一個(gè)函數(shù)作為參數(shù),該函數(shù)用Lambda表達(dá)式表示。
Map
1、map生成的是個(gè)一對(duì)一映射,for的作用
2、比較常用
3、而且很簡(jiǎn)單
FlatMap
1、顧名思義,跟map差不多,更深層次的操作
2、但還是有區(qū)別的
3、map和flat返回值不同
4、Map 每個(gè)輸入元素,都按照規(guī)則轉(zhuǎn)換成為另外一個(gè)元素。
還有一些場(chǎng)景,是一對(duì)多映射關(guān)系的,這時(shí)需要 flatMap。
5、Map一對(duì)一
6、Flatmap一對(duì)多
7、map和flatMap的方法聲明是不一樣的
(1)
(2)
(3) map和flatMap的區(qū)別:我個(gè)人認(rèn)為,flatMap的可以處理更深層次的數(shù)據(jù),入?yún)槎鄠€(gè)list,結(jié)果可以返回為一個(gè)list,而map是一對(duì)一的,入?yún)⑹嵌鄠€(gè)list,結(jié)果返回必須是多個(gè)list。通俗的說,如果入?yún)⒍际菍?duì)象,那么flatMap可以操作對(duì)象里面的對(duì)象,而map只能操作***層。
Reduce
1、感覺類似遞歸
2、數(shù)字(字符串)累加
3、個(gè)人沒咋用過
Collect
1、collect在流中生成列表,map,等常用的數(shù)據(jù)結(jié)構(gòu)
2、toList()
3、toSet()
4、toMap()
5、自定義
Optional
1、Optional 是為核心類庫新設(shè)計(jì)的一個(gè)數(shù)據(jù)類型,用來替換 null 值。
2、人們對(duì)原有的 null 值有很多抱怨,甚至連發(fā)明這一概念的Tony Hoare也是如此,他曾說這是自己的一個(gè)“價(jià)值連城的錯(cuò)誤”
3、用處很廣,不光在lambda中,哪都能用
4、Optional.of(T),T為非空,否則初始化報(bào)錯(cuò)
5、Optional.ofNullable(T),T為任意,可以為空
6、isPresent(),相當(dāng)于 !=null
7、ifPresent(T), T可以是一段lambda表達(dá)式 ,或者其他代碼,非空則執(zhí)行
并發(fā)
1、stream替換成parallelStream或 parallel
2、輸入流的大小并不是決定并行化是否會(huì)帶來速度提升的唯一因素,性能還會(huì)受到編寫代碼的方式和核的數(shù)量的影響
3、影響性能的五要素是:數(shù)據(jù)大小、源數(shù)據(jù)結(jié)構(gòu)、值是否裝箱、可用的CPU核數(shù)量,以及處理每個(gè)元素所花的時(shí)間
調(diào)試
1、list.map.fiter.map.xx 為鏈?zhǔn)秸{(diào)用,最終調(diào)用collect(xx)返回結(jié)果
2、分惰性求值和及早求值
3、判斷一個(gè)操作是惰性求值還是及早求值很簡(jiǎn)單:只需看它的返回值。如果返回值是 Stream,那么是惰性求值;如果返回值是另一個(gè)值或?yàn)榭眨敲淳褪羌霸缜笾?。使用這些操作的理想方式就是形成一個(gè)惰性求值的鏈,***用一個(gè)及早求值的操作返回想要的結(jié)果。
4、通過peek可以查看每個(gè)值,同時(shí)能繼續(xù)操作流