Java中List常用操作比for循環(huán)更優(yōu)雅的寫法示例
引言
使用JDK1.8之后,大部分list的操作都可以使用lambda表達(dá)式去寫,可以讓代碼更簡潔,開發(fā)更迅速。以下是我在工作中常用的lambda表達(dá)式對list的常用操作,喜歡建議收藏。
以用戶表為例,用戶實(shí)體代碼如下:
public class User { private Integer id; //id private String name; //姓名 private Integer age; //年齡 private Integer departId; //所屬部門id } List<User> list = new ArrayList<>();
簡單遍歷
使用lambda表達(dá)式之前,如果需要遍歷list時(shí),一般使用增強(qiáng)for循環(huán),代碼如下:
List<User> list = new ArrayList<>(); for (User u:list) { System.out.println(u.toString()); }
使用lambda表達(dá)式之后,可以縮短為一行代碼:
list.forEach(u-> System.out.println(u.toString()));
篩選符合某屬性條件的List集合
以篩選年齡在15-17之間的用戶為例,for循環(huán)寫法為:
List<User> users = new ArrayList<>(); for (User u : list) { if (u.getAge() >= 15 && u.getAge() <= 17) { users.add(u); } }
使用lambda表達(dá)式寫法為:
List<User> 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<Integer> ids = new ArrayList<>(); for (User u:list) { ids.add(u.getId()); }
lambda表達(dá)式寫法為:
List<User> users = list.stream() .filter(u -> u.getAge() >= 15 && u.getAge() <= 17) .collect(Collectors.toList());
獲取以某屬性為key,其他屬性或者對應(yīng)對象為value的Map集合
以用戶id為key(有時(shí)可能需要以用戶編號為key),以id對應(yīng)的user作為value構(gòu)建Map集合,for循環(huán)寫法為:
Map<Integer,User> userMap = new HashMap<>(); for (User u:list) { if (!userMap.containsKey(u.getId())){ userMap.put(u.getId(),u); } }
lambda表達(dá)式寫法為:
Map<Integer,User> map = list.stream() .collect(Collectors.toMap(User::getId, Function.identity(), (m1,m2)->m1));
Function.identity()返回一個(gè)輸出跟輸入一樣的Lambda表達(dá)式對象,等價(jià)于形如t -> t形式的Lambda表達(dá)式。
(m1,m2)-> m1此處的意思是當(dāng)轉(zhuǎn)換map過程中如果list中有兩個(gè)相同id的對象,則map中存放的是第一個(gè)對象,此處可以根據(jù)項(xiàng)目需要自己寫。
以某個(gè)屬性進(jìn)行分組的Map集合
以部門id為例,有時(shí)需要根據(jù)部門分組,篩選出不同部門下的人員,如果使用for循環(huán)寫法為:
Map<Integer,List<User>> departGroupMap = new HashMap<>(); for (User u:list) { if (departGroupMap.containsKey(u.getDepartId())){ departGroupMap.get(u.getDepartId()).add(u); }else { List<User> users1 = new ArrayList<>(); users1.add(u); departGroupMap.put(u.getDepartId(),users1); } }
使用lambda表達(dá)式寫法為:
Map<Integer,List<User>> departGroupMap = list.stream() .collect(Collectors .groupingBy(User::getDepartId));
其他情況
可以根據(jù)需要結(jié)合stream()進(jìn)行多個(gè)操作,比如篩選出年齡在15-17歲的用戶,并且根據(jù)部門進(jìn)行分組分組,如果使用for循環(huán),代碼如下:
Map<Integer,List<User>> 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<User> users1 = new ArrayList<>(); users1.add(u); departGroupMap.put(u.getDepartId(),users1); } } }
使用lambda表達(dá)式,代碼如下:
Map<Integer,List<User>> departGroupMap = list.stream() .filter(u->u.getAge() >= 15 && u.getAge() <= 17) .collect(Collectors.groupingBy(User::getDepartId));
總結(jié)
上述部分是小編在工作中遇到的常用的單個(gè)List的操作,可能在項(xiàng)目中還會(huì)遇到更復(fù)雜的場景,可以根據(jù)需要進(jìn)行多個(gè)方法的組合使用,我的感覺是使用lambda表達(dá)式代碼更加簡潔明了,當(dāng)然各人有各人的編碼習(xí)慣,不喜勿噴。
到此這篇關(guān)于Java中List常用操作比for循環(huán)更優(yōu)雅的寫法的文章就介紹到這了,更多相關(guān)Java中List常用操作內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Spring中的@ModelAttribute模型屬性綁定詳解
這篇文章主要介紹了Spring中的@ModelAttribute模型屬性綁定詳解,@ModelAttribute用于將方法參數(shù)或返回值綁定到Model屬性上,并公開給Web視圖,支持使用@RequestMapping注釋的Controller類,需要的朋友可以參考下2024-02-02Spring-retry實(shí)現(xiàn)循環(huán)重試功能
這篇文章主要介紹了Spring-retry 優(yōu)雅的實(shí)現(xiàn)循環(huán)重試功能,通過@Retryable注解,優(yōu)雅的實(shí)現(xiàn)循環(huán)重試功能,需要的朋友可以參考下2023-07-07SpringBoot+MyBatis-Plus實(shí)現(xiàn)數(shù)據(jù)庫讀寫分離的代碼示例
在當(dāng)今互聯(lián)網(wǎng)應(yīng)用中,數(shù)據(jù)庫讀寫分離是提高系統(tǒng)性能和穩(wěn)定性的重要手段之一,通過將讀操作和寫操作分別路由到不同的數(shù)據(jù)庫節(jié)點(diǎn),可以有效減輕數(shù)據(jù)庫服務(wù)器的負(fù)擔(dān),本文將介紹如何利用SpringBoot和MyBatis-Plus框架實(shí)現(xiàn)數(shù)據(jù)庫讀寫分離,需要的朋友可以參考下2023-11-11selenium4.0版本在springboot中的使用問題的坑
本文主要介紹了selenium4.0版本在springboot中的使用問題的坑,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-07-07詳解Java創(chuàng)建多線程的四種方式以及優(yōu)缺點(diǎn)
這篇文章主要介紹了Java創(chuàng)建多線程的四種方式以及優(yōu)缺點(diǎn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-11-11解決spring boot 1.5.4 配置多數(shù)據(jù)源的問題
下面小編就為大家?guī)硪黄鉀Qspring boot 1.5.4 配置多數(shù)據(jù)源的問題。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-06-06