Stream將List轉換為Map,使用Collectors.toMap方法進行轉換
背景:User類,類中分別有id,name,age三個屬性。List集合,userList,存儲User對象
1、指定key-value,value是對象中的某個屬性值。
Map<Integer,String> userMap1 = userList.stream().collect(Collectors.toMap(User::getId,User::getName));
2、指定key-value,value是對象本身,User->User 是一個返回本身的lambda表達式
Map<Integer,User> userMap2 = userList.stream().collect(Collectors.toMap(User::getId,User->User));
3、指定key-value,value是對象本身,Function.identity()是簡潔寫法,也是返回對象本身
Map<Integer,User> userMap3 = userList.stream().collect(Collectors.toMap(User::getId, Function.identity()));
4、指定key-value,value是對象本身,Function.identity()是簡潔寫法,也是返回對象本身,key 沖突的解決辦法,這里選擇第二個key覆蓋第一個key。
Map<Integer,User> userMap4 = userList.stream().collect(Collectors.toMap(User::getId, Function.identity(),(key1,key2)->key2));
實際項目中的例子:
T_CONTACTOR表結構主要有:

T_FUNDCONTACTRELA表結構主要有:

業務如下:首先有一張產品跟聯系人關聯關系表和一張聯系人表,當我在界面新增一個聯系人數據時,數據進入的是T_CONTACTOR表,如果需要給該聯系人綁定產品,則加一條數據進入T_FUNDCONTACTRELA產品聯系人關聯關系表,在關聯關系表的主要有CONTACTOR_ID這個字段綁定關系。那么下面我在頁面根據產品ID為條件查詢出所有跟該產品綁定了關聯關系的聯系人(主鍵是CONTACTOR_ID),然后在界面上想要展示的是這個產品下的聯系人的詳細信息。那么代碼實現(因為項目因為,使用單表查詢然后在使用java去匹配,更快捷的方式當然是使用兩個表聯合查詢)做法可以有如下:
// 首先第一步就是從產品聯系人關聯關系表根據前端界面傳遞的產品ID查詢出綁定了該產品下的所有聯系人
List<FundContRela> fundContRelaList = fundContRelaAtom.getFundContRela(fundContRela);
if (CollectionUtils.isNotEmpty(fundContRelaList)) {
// 第二步就是從聯系人表查詢出所有聯系人
List<ContactorInfoInputDTO> contactorListDTOList = getContactorList(fundContactorListDTO);
// 查詢的聯系人信息不能為空
if (CollectionUtils.isNotEmpty(contactorListDTOList)) {
// 將list集合轉化成Map<聯系人主鍵ID, 聯系人對象>這種格式
Map<String, ContactorInfoInputDTO> contactorListDTOMap = contactorListDTOList.stream().
collect(Collectors.toMap(ContactorInfoInputDTO::getContactorId, Function.identity()));
//3、遍歷關系集合,匹配聯系人
fundContRelaList.forEach(v -> {
FundContactorListDTO target = new FundContactorListDTO();
BeanUtils.copyProperties(v, target);
// contactorListDTOMap.get(v.getContactorId()) != null 判斷作用就是為了過濾出存在產品聯系人關聯關系表根據產品ID查詢出來的集合fundContRelaList 范圍內的聯系人
if (null != contactorListDTOMap && null != contactorListDTOMap.get(v.getContactorId())) {
ContactorInfoInputDTO source = contactorListDTOMap.get(v.getContactorId());
BeanUtils.copyProperties(source, target);
}
out.add(target);
});
}
}
