Java stream實現list轉化為map
在Stream流中將List轉換為Map,是使用Collectors.toMap方法來進行轉換。
- key和value都是對象中的某個屬性值。
Map<String, String> userMap1 = userList.stream().collect(Collectors.toMap(User::getId, User::getName));
- 使用箭頭函數
Map中,key是對象中的某個屬性值,value是對象本身。
Map<String, User> userMap2 = userList.stream().collect(Collectors.toMap(User::getId, User -> User));
- 使用Lambda表達式
key是對象中的某個屬性值,value是對象本身(使用Function.identity()的簡潔寫法)。
Map<String, User> userMap3 = userList.stream().collect(Collectors.toMap(User::getId, Function.identity()));
- 處理重復的key
key是對象中的某個屬性值,value是對象本身,當key沖突時選擇第二個key值覆蓋第一個key值。
Map<String, User> userMap4 = userList.stream().collect(Collectors.toMap(User::getId, Function.identity(), (oldValue, newValue) -> newValue));
如果不正確指定Collectors.toMap方法的第三個參數(key沖突處理函數),那么在key重復的情況下該方法會報出【Duplicate Key】的錯誤導致Stream流異常終止,使用時要格外注意這一點。當然,也可以使用第一個key覆蓋第二個key。
- 轉換成TreeMap
public static void main(String[] args) {
//將List轉換為Map,解決key沖突的問題
TreeMap<String,String> collect = users.stream().
//User對象的id屬性作為key,但是key相同時,使用舊的value值
collect(Collectors.toMap(User::getId, User::getName,
(k1, k2) -> k1, TreeMap::new
));
System.out.println(collect);
}
如果把TreeMap改為LinkedHashMap,就可以轉換成LinkedHashMap。
- 以某個屬性分組
主要用于對相同key值的數據進行合并,例如統計各個部門的員工名單時,就要把全部員工list轉換成以部門維度匯總的map。示例以部門ID進行分組,相同ID 的員工映射到同一個ID:
Map<String, List<User>> map = list.stream().collect(Collectors.groupingBy(User::getDepartmentId));
Reference
讀后有收獲,小禮物走一走,請作者喝咖啡。
Buy me a coffee. ?Get red packets.作者:樓蘭胡楊
本文版權歸作者和博客園共有,歡迎轉載,但請注明原文鏈接,并保留此段聲明,否則保留追究法律責任的權利。

浙公網安備 33010602011771號