解决异常:java.lang.IllegalStateException: Duplicate key **
最近在项目中使用java8的list 转 map的时候遇到了重复值的异常:
Exception in thread "main" java.lang.IllegalStateException: Duplicate key Person@568db2f2 at java.util.stream.Collectors.lambda$throwingMerger$0(Collectors.java:133) at java.util.HashMap.merge(HashMap.java:1245) at java.util.stream.Collectors.lambda$toMap$58(Collectors.java:1320) at java.util.stream.ReduceOps$3ReducingSink.accept(ReduceOps.java:169)
1、写了测试类重现异常:
在业务场景中出现重复值的时候我们希望使用新的值替换之前的值:
public static void main(String[] args) { Person a1= new Person("p","p1"); Person a2= new Person("p","p2"); Person a3= new Person("p1","p3"); List<Person> list = new ArrayList<Person>(); list.add(a1); list.add(a2); list.add(a3); //下面这句会出异常java.lang.IllegalStateException: Duplicate key Map<String, Person> map1 = list.stream().collect(Collectors.toMap(Person::getName , (p) -> p)); } class Person { private String name; private String sex; public Person(String name, String sex) { super(); this.name = name; this.sex = sex; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } }
这段代码会抛出开头贴出来的异常:java.lang.IllegalStateException: Duplicate key **
总结一下:
使用Collectors.toMap方法时的两个问题:
1、当key重复时,会抛出异常:java.lang.IllegalStateException: Duplicate key **
2、当value为null时,会抛出异常:java.lang.NullPointerException
大家通常希望这个方法是可以容错的,遇到重复的key就使用后者替换,而且HashMap的value可以是null。
将之前出错的代码调整如下:
//下面这句会出异常java.lang.IllegalStateException: Duplicate key Map<String, Person> map1 = list.stream().collect(Collectors.toMap(Person::getName , (p) -> p)); //修改为下面这句 Map<String, Person> map2 = list.stream().collect(Collectors.toMap(Person::getName , (p) -> p,(k,v)->v));
记录一下:
//1.针对重复key的 覆盖之前的value list.stream().collect(Collectors.toMap(Person::getName, Person::getSex,(k,v)->v)); //2.value为空,直接存放 不调用map.merge。同样适用于1(key重复的情况) list.stream().collect(Collector.of(HashMap::new, (m,per)->m.put(per.getName(),per.getSex()), (k,v)->v, Characteristics.IDENTITY_FINISH)); //其中lambda表达式: (k,v)->v 不会被调用,但是又不能为空
相关推荐
主要介绍了Java 8 Stream Collectors 功能与操作方法,结合实例形式详细分析了Java 8 Stream Collectors 功能、操作方法及相关注意事项,需要的朋友可以参考下
在Java 8个流API,你可以收集你的要素Stream采用的的多种方法之一java.util.Collectors类。 要收集java.util.List的元素,您可以这样做: list . stream() . collect( Collectors . toList()); 但是返回的List是...
Parallel Collectors 是一个工具包,使用 Stream API 简化 Java 中的并行收集处理......但没有标准并行流强加的限制。 list.stream() .collect(parallel(i -> foo(i), toList(), executor, parallelism)) ....
java stream源码预定义的Java流收集器 介绍 有几种方法可以将Stream作为一系列输入元素简化为一个汇总结果。...要收集要设置的Stream,可以使用toSet方法中的收集器。 不能保证返回的Set的类型,可变性
主要介绍了Java8 Stream Collectors收集器使用方法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
大家好,又见面了。 在我前面的文章《 吃透JAVA的Stream流操作,多年实践总结》中呢,对Stream的整体情况进行了细致全面的讲解,也大概介绍了下结果收集器Collectors的常见用法 ——
JDK8 Collectors.toMap IllegalStateException Duplicate key DEMO
java8流源码流 一个极其不完整的 Java Stream 库,它反映了 Java 8 标准库流类的公共接口。 这主要用于 Android 开发,在这种情况下,完全重新实现 Stream 库会过大或不可行(即,使用 Android Stream 库需要 24 的...
自华山版现身武林以来,大家都叫泰山泰山快现身,但是一开始我是拒绝的,不能因为你说来,我就马上来,直到我遇到了 stream.Collectors 类下 toMap() 方法的坑,转化逻辑对我等键盘侠来说应该是手到擒来,谁知一脚深...
主要介绍了Java9 Stream Collectors新增功能(小结),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
2020.04.22发布的最新版本,相比华山版有如下... SQL查询的表别名限定,Collectors类的toMap()方法使用注意等。 3)修改描述90处。比如,阻塞等待锁、建表的小数类型等。 4)完善若干处示例。比如,ISNULL的示例等
/** * 递归查询子节点. * * @param root 根节点. * @param all 所有节点. * @return 根节点信息. */ private List<Menu> getChildrens(Menu root, ... ).collect(Collectors.toList()); return children; }
细述 Java垃圾回收机制Types of Java Garbage Collectors本文非原创,翻译自Types of Java Garbage Coll
he Definitive Guide to Lambda Expressions Mastering Lambdas: Java Programming in a Multicore World describes how the lambda-related features of Java SE 8 will enable Java to meet the challenges of ...
Modern Java Recipes: Simple Solutions to Difficult Problems in Java 8 and 9 by Ken Kousen English | 11 Aug. 2017 | ISBN: 149197317X | ASIN: B074R6B13N | 322 Pages | AZW3 | 1.35 MB The introduction of...
The introduction of functional programming concepts in Java SE 8 was a drastic change for this venerable object-oriented language. Lambda expressions, method references, and streams fundamentally ...
Java 9 Revealed is for experienced Java programmers looking to make the migration from Java 7 or Java 8 to Java 9.Author Kishori Sharan begins by covering how to develop Java applications using new ...
Recipes cover: The basics of lambda expressions and method references Interfaces in the java.util.function package Stream operations for transforming and filtering data Comparators and Collectors for...
$$ \ Lambda _ {b} \ rightarrow N ^ * \ ell ^ + \ ell... 在计算中,负平价$$ \ Lambda _b ^ * $$ <math> <msubsup> Λ</ mi> <mi> b </ mi> <mo> ∗ </ mo> </ 通过构造和r消除msubsup> </ math>重子