• 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

  • https://www.cnblogs.com/yangsanluo/p/14976907.html
  •