List<Employee> emps = Arrays.asList(new Employee("1","shiyu"),
new Employee("2","haonan"),
new Employee("3","shoutao"));
1. 原始方法:遍历
Map<String,Employee> map = new HashMap<>();
for (Employee emp : emps) {
map.put(emp.getId(),emp);
}
2. Collectors.toMap方法
Map<String, String> empMap = emps.stream()
.collect(Collectors.toMap(Employee::getId, Employee::getName));
3. 如果希望Map的value是对象本身
Map<String, Employee> empMap = emps.stream().
collect(Collectors.toMap(Employee::getId, Function.identity()));
Map<String, Employee> empMap = emps.stream().
collect(Collectors.toMap(Employee::getId, c -> c));
4. 如果key可能会重复时用3中的方法可能会有IllegalStateException异常出现,可以用下面这个方法
// 当key出现冲突的时候,取后来的key,舍弃前面的key
Map<String, Employee> empMap = emps.stream().
collect(Collectors.toMap(Employee::getId, c -> c, (k1, k2) -> k2));
5. 如果希望根据key排序
Map<String, Employee> empMap = emps.stream().
collect(Collectors.toMap(Employee::getId, c -> c, (k1, k2) -> k2, TreeMap::new));
注意:Collectors.toMap
底层是基于 Map.merge
方法来实现的,而 merge
中 value
是不能为 null
的。如果为 null
,就会抛出空指针异常。