# 问题描述
使用Java8的toMap()方法将list集合转为map针对相同的key提示key重复问题
使用普通map复制相同的key不会提示异常
代码实现逻辑
package com.erin.beandemo.util;
import com.erin.beandemo.model.Person;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/**
* @Author: Erin
* @Date: 2021/5/25 17:13
* @Description:
*/
public class test {
public static void main(String[] args) {
Person person=new Person();
person.setName("1");
person.setId("2");
Person person1=new Person();
person1.setName("1");
person1.setId("2");
List<Person> personList=new ArrayList<>();
personList.add(person);
personList.add(person1);
// Map<String,String> map=new HashMap<>();
// for (Person person2:personList) {
// map.put(person2.getId(),person2.getName());
// }
// Map<String,String> employeeIdOrganizationIdMappings = personList.stream().collect(Collectors.toMap(Person::getId, Person::getName,(value1, value2 )->{
// return value2;
// }));
Map<String,String> employeeIdOrganizationIdMappings = personList.stream().collect(Collectors.toMap(Person::getId, Person::getName
));
System.out.println(employeeIdOrganizationIdMappings);
}
}
# 问题原因
# 解决方案
方法
Collectors.toMap(keyMapper, valueMapper, mergeFunction)
### 方案一
第一个参数是要生产的map的key ,第二个参数的生成的map的value值,第三个参数是当key发生重复时的处理方式,重复时需要返回一个数值放到当前的value处。
// 后面的值覆盖前面的值
Map<String,String> employeeIdOrganizationIdMappings = personList.stream().collect(Collectors.toMap(Person::getId, Person::getName,(value1, value2 )->{
return value2;
}));
Map<String,String> employeeIdOrganizationIdMappings = personList.stream().collect(Collectors.toMap(Person::getId, Person::getName,(value1, value2 )->{
return value1;
}));
### 方案二
重复时将之前的value和现在的value拼接或者相加起来
Map<String,String> employeeIdOrganizationIdMappings = personList.stream().collect(Collectors.toMap(Person::getId, Person::getName
,(value1 , value2)-> value1 + "," + value2 )
);
### 方案三
将重复的value值拼接成一个集合
Map<String, List<String>> employeeIdOrganizationIdMappings = personList.stream().collect(Collectors.toMap(Person::getId,
// 此时的value值为list集合
s -> {
List<String> list = new ArrayList<>();
list.add(s.getName());
return list;
},
// 重复时将现在的值全部加入到之前的值内
(List<String> value1, List<String> value2) -> {
value1.addAll(value2);
return value1;
}
));
结果: