Java8新特性Stream之list转map及问题(Duplicate key)解决,附实验结果

Java8新特性Stream之list转map及问题(Duplicate key)解决,附实验结果

 

Exception in thread "main" java.lang.IllegalStateException: Duplicate key ??*VO (??=AAAAA, ??**=1, **??=null, ??=null)
    at java.util.stream.Collectors.lambda$throwingMerger$113(Collectors.java:133)
    at java.util.stream.Collectors$$Lambda$3/398887205.apply(Unknown Source)
    at java.util.HashMap.merge(HashMap.java:1245)
    at java.util.stream.Collectors.lambda$toMap$171(Collectors.java:1320)
    at java.util.stream.Collectors$$Lambda$5/762218386.accept(Unknown Source)
    at java.util.stream.ReduceOps$3ReducingSink.accept(ReduceOps.java:169)
    at java.util.stream.DistinctOps$1$2.accept(DistinctOps.java:175)
    at java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1374)
    at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:512)
    at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:502)
    at java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:708)
    at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
    at java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:499)
    at com.*********************.main(??Service.java:271)

 

Java8使用stream的List转map遇到 Key重复的问题,直接转map时,你的key必须唯一:

public static void main(String[] args) {
        List<ElectricBalanceGoods> ebGoodsList = new ArrayList<>();
        ElectricBalanceGoods e0 = new ElectricBalanceGoods();
        e0.setDeviceCgid("AAAAA");
        e0.setBalanceId("1");
        e0.setId("1");
        ElectricBalanceGoods e1 = new ElectricBalanceGoods();
        e1.setDeviceCgid("AAAAA");
        e1.setBalanceId("1");
        e1.setId("2");
        ebGoodsList.add(e0);
        ebGoodsList.add(e1);
​
        Map<String, ElectricBalanceGoods> deviceBalance2ElectricBalanceGoodsMap = ebGoodsList.stream().distinct().collect(Collectors.toMap(egb -> egb.getDeviceCgid() + egb.getBalanceId(), ebg -> ebg));
        System.out.println(deviceBalance2ElectricBalanceGoodsMap);
​
    }

 

这个会报错:java.lang.IllegalStateException: Duplicate key

 

 

 

 

对key去重

 

 

关键代码

Function这个接口, 返回一个需要使用的数据。

这里要的是第一个出现的

Function.identity(),(e1, e2) -> e1)

可以操作e1、e2

 

比如俩都要:

放到list或者拼接起来、

 

 

更多操作(对value的操作)可以参考下面这篇文章:

https://blog.csdn.net/qq_39629277/article/details/83012548?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.nonecase&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.nonecase

Java 的 MyBatis 中,`ON DUPLICATE KEY UPDATE` 是一种在数据库插入操作中处理重复键冲突的机制。它通常用于 MySQL 数据库中的插入语句。 当你想要向数据库表中插入一行数据,但是该行数据的主键或唯一索引与已存在的数据冲突时,`ON DUPLICATE KEY UPDATE` 语句提供了一种解决方案。它允许你在冲突发生时执行更新操作,而不是简单地抛出错误。 在 MyBatis 的 XML 映射文件中,你可以使用 `ON DUPLICATE KEY UPDATE` 语句来处理重复键冲突。以下是一个示例代码: ```xml <!-- your-mapper.xml --> <insert id="insertOrUpdate" parameterType="YourObject"> INSERT INTO your_table (column1, column2, ...) VALUES (#{property1}, #{property2}, ...) ON DUPLICATE KEY UPDATE column1 = #{property1}, column2 = #{property2}, ... </insert> ``` 在上述代码中,`INSERT INTO` 子句用于插入数据,`VALUES` 子句用于指定要插入的值。接下来的 `ON DUPLICATE KEY UPDATE` 子句用于指定在出现重复键冲突时执行的更新操作。你可以通过列名和属性名的对应关系来更新相应的列。 需要注意的是,`ON DUPLICATE KEY UPDATE` 仅适用于具有唯一索引或主键约束的列。如果在插入时没有重复键冲突,将会执行插入操作;如果有冲突,将会执行更新操作。 此外,`ON DUPLICATE KEY UPDATE` 语句在不同的数据库中可能有所不同,具体的语法和支持程度可能会有差异。请根据你所使用的数据库类型和版本进行相应的调整。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值