引言 使用JDK1.8之后行冰,大部分list的操作都可以使用lamada表達(dá)式去寫溺蕉,可以讓代碼更簡(jiǎn)潔,開發(fā)更迅速悼做。以下是我在工作中常用的lamada表達(dá)式對(duì)list的常用操作疯特,喜歡建議收藏。 以用...

使用JDK1.8之后肛走,大部分list的操作都可以使用lamada表達(dá)式去寫辙芍,可以讓代碼更簡(jiǎn)潔,開發(fā)更迅速羹与。以下是我在工作中常用的lamada表達(dá)式對(duì)list的常用操作,喜歡建議收藏庶灿。

以用戶表為例纵搁,用戶實(shí)體代碼如下:

public class User { private Integer id; //id private String name; //姓名 private Integer age; //年齡 private Integer departId; //所屬部門id}List<User> list = new ArrayList<>();


簡(jiǎn)單遍歷

使用lamada表達(dá)式之前,如果需要遍歷list時(shí)往踢,一般使用增強(qiáng)for循環(huán)腾誉,代碼如下:

List list = new ArrayList<>();for (User u:list) {? ? System.out.println(u.toString());}

使用lamada表達(dá)式之后,可以縮短為一行代碼:

list.forEach(u-> System.out.println(u.toString()));

篩選符合某屬性條件的List集合

以篩選年齡在15-17之間的用戶為例峻呕,for循環(huán)寫法為:

List users = new ArrayList<>();for (User u : list) {if (u.getAge() >= 15 && u.getAge() <= 17) {users.add(u);}}

使用lamada表達(dá)式寫法為:

List users = list.stream()? ? ? ? ? ? ? ? ? ? ? ? ? .filter(u -> u.getAge() >= 15 && u.getAge() <= 17)? ? ? ? ? ? ? ? ? ? ? ? ? .collect(Collectors.toList());

獲取某屬性返回新的List集合

以獲取id為例利职,項(xiàng)目中有時(shí)候可能會(huì)需要根據(jù)用戶id的List進(jìn)行查詢或者批量更新操作,這時(shí)候就需要用戶id的List集合瘦癌,for循環(huán)寫法為:

List ids = new ArrayList<>();for (User u:list) {ids.add(u.getId());}

lamada表達(dá)式寫法為:

List ids = list.stream()? ? ? ? ? ? ? ? ? ? ? ? ? .map(User::getId).collect(Collectors.toList());

獲取以某屬性為key猪贪,其他屬性或者對(duì)應(yīng)對(duì)象為value的Map集合

以用戶id為key(有時(shí)可能需要以用戶編號(hào)為key),以id對(duì)應(yīng)的user作為value構(gòu)建Map集合,for循環(huán)寫法為:

Map userMap = new HashMap<>();for (User u:list) {if (!userMap.containsKey(u.getId())){userMap.put(u.getId(),u);}}

lamada表達(dá)式寫法為:

Map map = list.stream()? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? .collect(Collectors.toMap(User::getId,? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? Function.identity(),? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? (m1,m2)->m1));

Function.identity()返回一個(gè)輸出跟輸入一樣的Lambda表達(dá)式對(duì)象讯私,等價(jià)于形如t -> t形式的Lambda表達(dá)式热押。

(m1,m2)-> m1此處的意思是當(dāng)轉(zhuǎn)換map過(guò)程中如果list中有兩個(gè)相同id的對(duì)象,則map中存放的是第一個(gè)對(duì)象斤寇,此處可以根據(jù)項(xiàng)目需要自己寫桶癣。

以某個(gè)屬性進(jìn)行分組的Map集合

以部門id為例,有時(shí)需要根據(jù)部門分組娘锁,篩選出不同部門下的人員牙寞,如果使用for循環(huán)寫法為:

Map> departGroupMap = new HashMap<>();for (User u:list) {if (departGroupMap.containsKey(u.getDepartId())){? ? ? ? ? ? departGroupMap.get(u.getDepartId()).add(u);}else {? ? ? ? ? ? List users1 = new ArrayList<>();? ? ? ? ? ? users1.add(u);? ? ? ? ? ? departGroupMap.put(u.getDepartId(),users1);}}

使用lamada表達(dá)式寫法為:

Map> departGroupMap = list.stream()? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? .collect(Collectors? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? .groupingBy(User::getDepartId));

其他情況

可以根據(jù)需要結(jié)合stream()進(jìn)行多個(gè)操作,比如篩選出年齡在15-17歲的用戶莫秆,并且根據(jù)部門進(jìn)行分組分組间雀,如果使用for循環(huán)悔详,代碼如下:

Map> departGroupMap = new HashMap<>();for (User u:list) {if (u.getAge() >= 15 && u.getAge() <= 17) {if (departGroupMap.containsKey(u.getDepartId())){departGroupMap.get(u.getDepartId()).add(u);}else {List users1 = new ArrayList<>();users1.add(u);departGroupMap.put(u.getDepartId(),users1);}}}

使用lamada表達(dá)式,代碼如下:

Map> departGroupMap = list.stream()? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? .filter(u->u.getAge() >= 15 && u.getAge() <= 17)? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? .collect(Collectors.groupingBy(User::getDepartId));

總結(jié)

上述部分是小編在工作中遇到的常用的單個(gè)List的操作雷蹂,可能在項(xiàng)目中還會(huì)遇到更復(fù)雜的場(chǎng)景伟端,可以根據(jù)需要進(jìn)行多個(gè)方法的組合使用,我的感覺是使用lamada表達(dá)式代碼更加簡(jiǎn)潔明了匪煌,當(dāng)然各人有各人的編碼習(xí)慣责蝠,不喜勿噴。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末萎庭,一起剝皮案震驚了整個(gè)濱河市霜医,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌驳规,老刑警劉巖肴敛,帶你破解...
    沈念sama閱讀 206,214評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異吗购,居然都是意外死亡医男,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門捻勉,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)镀梭,“玉大人,你說(shuō)我怎么就攤上這事踱启”ㄕ耍” “怎么了?”我有些...
    開封第一講書人閱讀 152,543評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵埠偿,是天一觀的道長(zhǎng)透罢。 經(jīng)常有香客問(wèn)我,道長(zhǎng)冠蒋,這世上最難降的妖魔是什么羽圃? 我笑而不...
    開封第一講書人閱讀 55,221評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮抖剿,結(jié)果婚禮上统屈,老公的妹妹穿的比我還像新娘。我一直安慰自己牙躺,他們只是感情好愁憔,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,224評(píng)論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著孽拷,像睡著了一般吨掌。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,007評(píng)論 1 284
  • 那天膜宋,我揣著相機(jī)與錄音窿侈,去河邊找鬼。 笑死秋茫,一個(gè)胖子當(dāng)著我的面吹牛史简,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播肛著,決...
    沈念sama閱讀 38,313評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼圆兵,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了枢贿?” 一聲冷哼從身側(cè)響起殉农,我...
    開封第一講書人閱讀 36,956評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎局荚,沒想到半個(gè)月后超凳,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,441評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡耀态,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,925評(píng)論 2 323
  • 正文 我和宋清朗相戀三年轮傍,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片首装。...
    茶點(diǎn)故事閱讀 38,018評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡金麸,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出簿盅,到底是詐尸還是另有隱情,我是刑警寧澤揍魂,帶...
    沈念sama閱讀 33,685評(píng)論 4 322
  • 正文 年R本政府宣布桨醋,位于F島的核電站,受9級(jí)特大地震影響现斋,放射性物質(zhì)發(fā)生泄漏喜最。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,234評(píng)論 3 307
  • 文/蒙蒙 一庄蹋、第九天 我趴在偏房一處隱蔽的房頂上張望瞬内。 院中可真熱鬧,春花似錦限书、人聲如沸虫蝶。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)能真。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間粉铐,已是汗流浹背疼约。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評(píng)論 1 261
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留蝙泼,地道東北人程剥。 一個(gè)月前我還...
    沈念sama閱讀 45,467評(píng)論 2 352
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像汤踏,于是被迫代替她去往敵國(guó)和親织鲸。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,762評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容