別再問(wèn)問(wèn)JDK的Stream怎么用了好么?面試官
JDK8發(fā)布到現(xiàn)在,已經(jīng)過(guò)了8年的時(shí)間了,但是就是到現(xiàn)在,依然在面試的過(guò)程中,還有人問(wèn)這個(gè) JDK8 里面都優(yōu)化了什么內(nèi)容,對(duì)比 JDK7 來(lái)說(shuō),今天阿粉就再繼續(xù)叨叨一次,真的是讓面試官給整服氣了。
JDK8 的 Stream
JDK8 要說(shuō)牛,那是真的牛,讓你的代碼變的更加的簡(jiǎn)潔,為什么這么說(shuō),那就是因?yàn)?Stream 流的存在。
Stream 是 Java8 中處理集合的關(guān)鍵抽象概念,它可以指定你希望對(duì)集合進(jìn)行的操作,可以執(zhí)行非常復(fù)雜的查找、過(guò)濾和映射數(shù)據(jù)等操作。使用Stream API 對(duì)集合數(shù)據(jù)進(jìn)行操作,就類似于使用 SQL 執(zhí)行的數(shù)據(jù)庫(kù)查詢。也可以使用 Stream API 來(lái)并行執(zhí)行操作。簡(jiǎn)而言之,Stream API 提供了一種高效且易于使用的處理數(shù)據(jù)的方式。
其實(shí)說(shuō)這些話術(shù)類的,都是白搭,最主要的,還得是 Stream 的使用。
Stream的使用
篩選
其實(shí)篩選很簡(jiǎn)單,為什么這么說(shuō)呢,因?yàn)楹Y選,比如我們現(xiàn)在有三個(gè)人,張三,李四,王五,年齡分別是 20 ,22,27,我們要篩選出年齡大于20的人,并且組合成一個(gè)新的結(jié)果集返回,那么代碼肯定是:
上面的handleUser只是一個(gè)賦值的操作,代碼也放上:
這時(shí)候,我們獲取到geUser這個(gè)結(jié)果集,就是我們篩選之后的,年齡大于20歲的人的數(shù)據(jù)。
那么如果使用 JDK8 的Stream 怎么來(lái)操作呢?
其實(shí)也不難
一行代碼,直接來(lái)個(gè)鏈?zhǔn)骄幊?,一行代碼直接篩選出來(lái),二者的結(jié)果都是一樣的,區(qū)別只是在代碼量上面,一個(gè)需要自己創(chuàng)建一個(gè)List 自己來(lái)操作,另外一個(gè),直接不需要自己再創(chuàng)建了,直接在后面的 Collectors 給創(chuàng)建了,也是一種簡(jiǎn)化代碼的方法。
循環(huán)
從這里我們來(lái)看 Stream 的循環(huán),循環(huán) for ,JDK7 和 JDK8 的循環(huán)的本質(zhì),并沒(méi)啥變化,變化的只是開(kāi)發(fā)者寫(xiě)的代碼。我們直接來(lái)對(duì)比一下寫(xiě)法上的區(qū)別。
循環(huán)區(qū)別好像并不大,看起來(lái)都挺方便的,所以使用什么,全看你自己。
聚合函數(shù)
為什么說(shuō)聚合函數(shù)呢?這個(gè)聚合函數(shù)用的最多的地方,是不是在數(shù)據(jù)庫(kù)中,我們獲取嗎,max,min,count 這些聚合字段的時(shí)候使用到的,如果你想要在程序中篩選,那么避免不了雙層的for循環(huán),然后去循環(huán)比對(duì),或者是通過(guò)Collections 去處理,但是如果你使用 Stream 的話,那就很簡(jiǎn)單了。
那么如果使用Stream 來(lái)獲取呢?
二者返回的結(jié)果也都是一模一樣的,但是代碼量來(lái)說(shuō),就不是一個(gè)層級(jí)了,至少 JDK8 能簡(jiǎn)化了許多的代碼,至少在開(kāi)發(fā)效率上面來(lái)說(shuō),就相對(duì)的比較快了。
min 也是同理,阿粉就不再贅述了,阿粉接下來(lái)說(shuō)說(shuō)這個(gè) count 。一般count都會(huì)在哪些地方使用呢?
count()是獲取流總數(shù)簡(jiǎn)寫(xiě)的方法。
其實(shí)和size就是一個(gè)意思,但是size我們是不能搭配一些filter使用的,但是count可以呀。
這么一看,是不是感覺(jué) Stream 里面的方法有時(shí)候也挺有用的,至少在代碼上,能夠讓我們省下來(lái)不少時(shí)間。
Map
其實(shí)還有一些不是那么常用的,比如Map,這個(gè)的用法一般屬于那種,不能夠進(jìn)行連表查詢的情況,就比如我們現(xiàn)在有一個(gè)訂單表,然后訂單表中有關(guān)聯(lián)的付款情況,這個(gè)時(shí)候就可能出現(xiàn),一個(gè)訂單,對(duì)應(yīng)多種付款情況,但是如果要是數(shù)據(jù)量非常大的情況,反而不太適合使用連表的查詢,于是只能先查詢出訂單,然后使用in的方式去查詢付款情況。
我們繼續(xù)用上面的 User 對(duì)象。
JDK7獲取List中的Id數(shù)據(jù):
JDK8 獲取Id數(shù)據(jù)
然后我們?cè)谟胕d去查詢指定的數(shù)據(jù)就可以了。
關(guān)于Stream 會(huì)用就好,真到面試問(wèn)到了,知道這些關(guān)鍵字都是干什么用的,也就可以了,如果還有人問(wèn)這個(gè)好幾年前的東西,那么這個(gè)公司好像也沒(méi)有什么進(jìn)去的必要了。你說(shuō)是么?