使用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í)慣责蝠,不喜勿噴。