java8 对象转Map时重复 key Duplicate key xxxx的解决

目录
  • java8 对象转Map时重复 key Duplicate key xxxx
    • 案例如下
    • 解决方案如下
    • 总结
  • java8 toMap(key重复如何解决)
    • 1、当key重复,使用最后一个value为值
    • 2、当key重复,使用list收集

java8 对象转Map时重复 key Duplicate key xxxx

我们在利用java8 Lambda 表达式将集合中对象的属性转成Map时就会出现 Duplicate key xxxx , 说白了也就是key 重复了!

案例如下

@Getter
@Setter
@AllArgsConstructor
public class Student{
    private String className;
    private String studentName;

    public static void main(String[] args) {
 List<Student> list = new ArrayList<>();
 list.add(new Student("一年级二班", "小明"));
 list.add(new Student("一年级二班", "小芳"));
 list.add(new Student("一年级二班", "小华"));
 list.add(new Student("一年级三班", "翠花"));
 list.add(new Student("一年级三班", "香兰"));
 // 集合中对象属性转map
 Map<String, String> map = list.stream().collect(Collectors.toMap(Student :: getClassName, Student :: getStudentName));
 System.out.println(map);
     }
}

此时将对象的 班级名称为 key 学生名称为 value,但运行时出现了多个相同的key ,此时编译器就会抛出 Duplicate key xxxx

解决方案如下

我们需要使用toMap的另外一个重载的方法!

Collectors.toMap(keyMapper, valueMapper, mergeFunction)

前两两个参数都是与之前一样 key 和 value得取值属性, 第三个参数是当key 发生重复时处理的方法,注释上的解释如下:

一种合并函数,用于解决两者之间的冲突与提供的相同键相关联的值到

{@link Map#merge(Object, Object, BiFunction)}

该合并函数有两个参数,第一个参数为当前重复key 之前对应的值,第二个为当前重复key 现在数据的值。

1、重复时采用后面的value 覆盖前面的value

Map<String, String> map = list.stream().collect(Collectors.toMap(Student :: getClassName, Student :: getStudentName,
 (value1, value2 )->{
            return value2;
 }));

输出:

{一年级三班=香兰, 一年级二班=小华}

也可以简写成这样:

Map<String, String> map = list.stream().collect(Collectors.toMap(Student :: getClassName, Student :: getStudentName,
 (key1 , key2)-> key2 ));

2、重复时将之前的value 和现在的value拼接或相加起来

Map<String, String> map = list.stream().collect(Collectors.toMap(Student :: getClassName, Student :: getStudentName,
 (key1 , key2)-> key1 + "," + key2 ));

输出:

{一年级三班=翠花,香兰, 一年级二班=小明,小芳,小华}

3、将重复key的数据变成一个集合!

Map<String, List<String>> map = list.stream().collect(Collectors.toMap(Student :: getClassName,
    // 此时的value 为集合,方便重复时操作
    s ->  {
 List<String> studentNameList = new ArrayList<>();
 studentNameList.add(s.getStudentName());
 return studentNameList;
    },
    // 重复时将现在的值全部加入到之前的值内
    (List<String> value1, List<String> value2) -> {
 value1.addAll(value2);
 return value1;
    }
));

输出:

{一年级三班=[翠花, 香兰], 一年级二班=[小明, 小芳, 小华]}

总结

这几个办法都是基于toMap重载方法第三个参数来实现的!至于哪个方法最好,我觉得应该取决于具体业务!

java8 toMap(key重复如何解决)

使用stream的toMap()函数时,当key重复,系统会报错相同的key不能形成一个map,那么需要解决这个问题。

一:相同key的情况下,丢弃重复的只保留一个。

二:相同key的情况下,把value变成list,形成Map(Object,List<Object>)的形式。

1、当key重复,使用最后一个value为值

2、当key重复,使用list收集

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • 解决使用stream将list转map时,key重复导致报错的问题

    要将List对象集合转为map集合,可以通过stream流的形式快速实现转换: //三个Users对象组成一个List集合 List<Users> list = new ArrayList<>(); list.add(Users.builder().userName("11").userId(1).build()); list.add(Users.builder().userName("11").userId(2).build()); lis

  • java8 Stream list to Map key 重复 value合并到Collectio的操作

    java8 Stream list to Map key 重复 value合并到Collectio 关于把list转换成key value的map有很多博客上都有实现,这里是一个把value放入到集合中去 List<String> list = Lists.newArrayList("1", "2", "3", "1"); Map<String, List<String>> map = li

  • java8快速实现List转map 、分组、过滤等操作

    利用java8新特性,可以用简洁高效的代码来实现一些数据处理. 定义1个Apple对象: public class Apple { private Integer id; private String name; private BigDecimal money; private Integer num; public Apple(Integer id, String name, BigDecimal money, Integer num) { this.id = id; this.name =

  • 详解Java8新特性Stream之list转map及问题解决

    List集合转Map,用到的是Stream中Collectors的toMap方法:Collectors.toMap 具体用法实例如下: //声明一个List集合 List<Person> list = new ArrayList(); list.add(new Person("1001", "小A")); list.add(new Person("1002", "小B")); list.add(new Person

  • java8 对象转Map时重复 key Duplicate key xxxx的解决

    目录 java8 对象转Map时重复 key Duplicate key xxxx 案例如下 解决方案如下 总结 java8 toMap(key重复如何解决) 1.当key重复,使用最后一个value为值 2.当key重复,使用list收集 java8 对象转Map时重复 key Duplicate key xxxx 我们在利用java8 Lambda 表达式将集合中对象的属性转成Map时就会出现 Duplicate key xxxx , 说白了也就是key 重复了! 案例如下 @Getter

  • mysql ON DUPLICATE KEY UPDATE重复插入时更新方式

    目录 mysql当插入重复时更新的方法 第一种方法 第二种方法 第三种方法 Mysql on duplicate key update 解决插入重复数据时更新值的问题以及其存在的问题 一.使用 二.存在问题 mysql当插入重复时更新的方法 第一种方法 示例一:插入多条记录 假设有一个主键为 client_id 的 clients 表,可以使用下面的语句: INSERT INTO clients (client_id,client_name,client_type) SELECT supplie

  • Java lambda list转换map时,把多个参数拼接作为key操作

    我就废话不多说了,大家还是直接看代码吧~ Map<String, Parts> partsMap = synList.stream().collect(Collectors.toMap(k -> k.getOe()+k.getOeId()+k.getPartGroupId()+k.getStdPartId()+k.getBrandCode(), part -> part)); 补充知识:Java8 Collectors.toMap的两个大坑 Collectors.toMap()方法

  • MYSQL的REPLACE和ON DUPLICATE KEY UPDATE语句介绍解决问题实例

    在对看看的后台进行排序的时候,遇到了一个像这样的需求,在电影表中有ID(主键自增)和orderby(排序字段) ,假设有十条数据id分别从1-10之间,对应的orderby也是从1-10之间,我现在想把id=9的数据移动到第三的位置(id=3)的这个位置,并且保证之前的数据排列顺序(即id=3的orderby=4,id=4的orderby=5-id=8的orderby=9),这样如果用循环的形式是可以解决数据的问题,但是这样操作数据库过程太多,现在就想用一条sql语句来解决这个问题. 下面来看看

  • mysql insert的几点操作(DELAYED,IGNORE,ON DUPLICATE KEY UPDATE )

    INSERT语法 INSERT [LOW_PRIORITY | DELAYED | HIGH_PRIORITY] [IGNORE] [INTO] tbl_name [(col_name,...)] VALUES ({expr | DEFAULT},...),(...),... [ ON DUPLICATE KEY UPDATE col_name=expr, ... ] 或: INSERT [LOW_PRIORITY | DELAYED | HIGH_PRIORITY] [IGNORE] [INT

  • MySQL的Replace into 与Insert into on duplicate key update真正的不同之处

    看下面的例子吧: 1 Replace into ...1.1 录入原始数据mysql> use test;Database changedmysql> mysql> CREATE TABLE t1 SELECT 1 AS a, 'c3' AS b, 'c2' AS c;ALTER TABLE t1 CHANGE a a INT PRIMARY KEY AUTO_INCREMENT ;Query OK, 1 row affected (0.03 sec)Records: 1  Duplic

  • 浅谈对象与Map相互转化

    javabean与map的转换有很多种方式,比如: 1.通过ObjectMapper先将bean转换为json,再将json转换为map,但是这种方法比较绕,且效率很低,经测试,循环转换10000个bean,就需要12秒!!!不推荐使用 2.通过java反射,获取bean类的属性和值,再转换到map对应的键值对中,这种方法次之,但稍微有点麻烦 3.通过net.sf.cglib.beans.BeanMap类中的方法,这种方式效率极高,它跟第二种方式的区别就是因为使用了缓存,初次创建bean时需要初

  • JAVA8独有的map遍历方式(非常好用)

    使用JAV8 带来的map遍历方式使遍历非常简单 public class LambdaMap { private Map<String, Object> map = new HashMap<>(); @Before public void initData() { map.put("key1", "value1"); map.put("key2", "value2"); map.put("k

  • java实体对象与Map之间的转换工具类代码实例

    这篇文章主要介绍了java实体对象与Map之间的转换工具类代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 Map接口中键和值一一映射. 可以通过键来获取值. 给定一个键和一个值,你可以将该值存储在一个Map对象. 之后,你可以通过键来访问对应的值. 当访问的值不存在的时候,方法就会抛出一个NoSuchElementException异常. 当对象的类型和Map里元素类型不兼容的时候,就会抛出一个 ClassCastException异常

随机推荐