引言
使用JDK1.8之后,大部分list的操作都可以使用lambda表達式去寫,可以讓代碼更簡潔,開發更迅速。以下是我在工作中常用的lambda表達式對list的常用操作,喜歡建議收藏。
以用戶表為例,用戶實體代碼如下:
1
2
3
4
5
6
7
8
9
10
11
|
public class User { private Integer id; //id private String name; //姓名 private Integer age; //年齡 private Integer departId; //所屬部門id } List<User> list = new ArrayList<>(); |
簡單遍歷
使用lambda表達式之前,如果需要遍歷list時,一般使用增強for循環,代碼如下:
1
2
3
4
|
List<User> list = new ArrayList<>(); for (User u:list) { System.out.println(u.toString()); } |
使用lambda表達式之后,可以縮短為一行代碼:
1
|
list.forEach(u-> System.out.println(u.toString())); |
篩選符合某屬性條件的List集合
以篩選年齡在15-17之間的用戶為例,for循環寫法為:
1
2
3
4
5
6
|
List<User> users = new ArrayList<>(); for (User u : list) { if (u.getAge() >= 15 && u.getAge() <= 17 ) { users.add(u); } } |
使用lambda表達式寫法為:
1
2
3
|
List<User> users = list.stream() .filter(u -> u.getAge() >= 15 && u.getAge() <= 17 ) .collect(Collectors.toList()); |
獲取某屬性返回新的List集合
以獲取id為例,項目中有時候可能會需要根據用戶id的List進行查詢或者批量更新操作,這時候就需要用戶id的List集合,for循環寫法為:
1
2
3
4
|
List<Integer> ids = new ArrayList<>(); for (User u:list) { ids.add(u.getId()); } |
lambda表達式寫法為:
1
2
3
|
List<User> users = list.stream() .filter(u -> u.getAge() >= 15 && u.getAge() <= 17 ) .collect(Collectors.toList()); |
獲取以某屬性為key,其他屬性或者對應對象為value的Map集合
以用戶id為key(有時可能需要以用戶編號為key),以id對應的user作為value構建Map集合,for循環寫法為:
1
2
3
4
5
6
|
Map<Integer,User> userMap = new HashMap<>(); for (User u:list) { if (!userMap.containsKey(u.getId())){ userMap.put(u.getId(),u); } } |
lambda表達式寫法為:
1
2
3
4
|
Map<Integer,User> map = list.stream() .collect(Collectors.toMap(User::getId, Function.identity(), (m1,m2)->m1)); |
Function.identity()返回一個輸出跟輸入一樣的Lambda表達式對象,等價于形如t -> t形式的Lambda表達式。
(m1,m2)-> m1此處的意思是當轉換map過程中如果list中有兩個相同id的對象,則map中存放的是第一個對象,此處可以根據項目需要自己寫。
以某個屬性進行分組的Map集合
以部門id為例,有時需要根據部門分組,篩選出不同部門下的人員,如果使用for循環寫法為:
1
2
3
4
5
6
7
8
9
10
|
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表達式寫法為:
1
2
3
|
Map<Integer,List<User>> departGroupMap = list.stream() .collect(Collectors .groupingBy(User::getDepartId)); |
其他情況
可以根據需要結合stream()進行多個操作,比如篩選出年齡在15-17歲的用戶,并且根據部門進行分組分組,如果使用for循環,代碼如下:
1
2
3
4
5
6
7
8
9
10
11
12
|
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表達式,代碼如下:
1
2
3
|
Map<Integer,List<User>> departGroupMap = list.stream() .filter(u->u.getAge() >= 15 && u.getAge() <= 17 ) .collect(Collectors.groupingBy(User::getDepartId)); |
總結
上述部分是小編在工作中遇到的常用的單個List的操作,可能在項目中還會遇到更復雜的場景,可以根據需要進行多個方法的組合使用,我的感覺是使用lambda表達式代碼更加簡潔明了,當然各人有各人的編碼習慣,不喜勿噴。
到此這篇關于Java中List常用操作比for循環更優雅的寫法的文章就介紹到這了,更多相關Java中List常用操作內容請搜索服務器之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持服務器之家!
原文鏈接:https://juejin.cn/post/7023760357407916063