`
ColorPanda
  • 浏览: 62959 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

java8 Stream API中Collectors中toMap方法的问题以及解决

 
阅读更多

解决异常: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、当valuenull时,会抛出异常:java.lang.NullPointerException

  

大家通常希望这个方法是可以容错的,遇到重复的key就使用后者替换,而且HashMapvalue可以是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中的`java.util.stream.Collectors.toMap()`方法有什么作用

    在Java中,java.util.stream.Collectors.toMap()方法是一个非常实用的工具,它允许我们将流(Stream)中的元素收集到一个Map中。这个方法是Collectors类中的一个静态方法,它实现了Collector接口,用于在流的终止...

    Java 8 Stream API 中的 Collectors.toSet() 深度解析

    在Java 8中引入的Stream API极大地简化了集合的处理,使得代码更加简洁和易于理解。Collectors.toSet()作为Stream API中的一个重要组成部分,它的作用是将流(Stream)中的元素收集到一个集合中,而这个默认集合就是...

    在Java 8中将List转换为Map对象方法

    在上面的代码中,我们使用了Collectors.toMap()方法,并添加了BinaryOperator方法来解决重复键的问题。 如果我们想要将List转换为Map,并对键进行自然排序,我们可以使用TreeMap来实现: Map, String&gt; ...

    JAVA8API-官方文档下载-中文版

    4. **集合工厂方法**: 集合接口如`List`, `Set`, `Map`增加了新的工厂方法,如`Collectors.toMap()`,简化了创建集合的操作。 5. **改进的类型推断**: Java 8提高了编译器的类型推断能力,使得lambda表达式和方法...

    Java 8 Stream 的终极技巧——Collectors 功能与操作方法详解

    Java 8 Stream Collectors 功能与操作方法详解 Java 8 Stream Collectors ...Collectors 是 Java 8 Stream Api 中的一个重要功能,提供了一系列的静态方法供我们使用,可以帮助我们更方便地对 Stream 进行处理和操作。

    Java 8 Stream Api 中的 map和 flatMap 操作方法

    Java 8 Stream Api 中的 map 和 flatMap 操作方法 ...map 和 flatMap 操作是 Java 8 Stream Api 中两个非常有用的操作方法,掌握这两个操作方法可以帮助开发者更方便地解决一些数据流的操作问题。

    java8-Stream API终端操作.pdf

    通过使用 Collectors.toSet() 方法可以将 Stream 处理结果收集到 Set 集合中。 2.2. 收集到 List 同样,也可以将元素收集到 List 集合中。 2.3. 收集到 Map collect 方法也可以将元素收集到 Map 集合中。 三、...

    java使用stream对日期排序

    在Java编程中,Stream API是Java 8引入的一个强大特性,它允许我们以声明性方式处理数据集合。本文将深入探讨如何使用Stream API对日期进行排序。日期排序在数据分析、日志处理、报表生成等场景中非常常见。下面我们...

    java8-如何使用Stream API对Map类型元素排序.pdf

    在Java 8中,Stream API引入了许多新的特性,使得对数据结构的操作更加简便高效,其中包括对Map类型元素的排序。本文将深入讲解如何使用Stream API对Map进行排序,包括按键排序、按值排序以及使用`merge()`函数处理...

    Java8 英文文档 API .zip

    - 在集合操作中,Java 8提供了并行流(Parallel Streams),可以自动利用多核处理器进行并行处理,如`list.parallelStream().collect(Collectors.toList())`。 7. **Nashorn JavaScript引擎**: - Java 8引入了...

    Java8 Stream Collectors收集器使用方法解析

    Java8 Stream Collectors收集器是Java8中Stream API的一种重要组件, Collectors是 Stream API 中的收集器接口,提供了许多实用的方法来处理Stream流数据。以下是Java8 Stream Collectors收集器使用方法解析的详细...

    Java8 Stream API 详细使用方法与操作技巧指南

    Java8 Stream API 详细使用方法与操作技巧指南 Java 8 引入了 Stream API,这是一个重要的特性,允许开发者以一种声明式的方式对数据进行处理。Stream 翻译过来是“流”,它可以看做是一个可操作的数据集序列,具有...

    java jdk 1.8 api 中文英文版

    Stream API是Java 8中的新特性,提供了一种序列处理数据的方式,支持集合操作的并行化。通过`stream()`方法,我们可以对集合进行操作,如过滤、映射、查找、排序等。这使得处理大量数据变得更加高效且易于理解。 3...

    Stream_Java8.pdf

    根据提供的文件信息,本文将详细介绍Java 8中Stream API的核心概念、使用方法及其实战案例。Stream API作为Java 8的重要特性之一,极大地简化了集合处理的代码编写过程,提升了程序的可读性和效率。 ### Stream概述...

    Java8中利用stream对map集合进行过滤的方法

    Java8中利用Stream对Map集合进行过滤的方法 Java8中引入了Stream API,提供了对集合的高效处理方式。本文将详细介绍如何使用Stream对Map集合进行过滤,包括使用filter方法过滤null和空字符串,以及使用map方法对...

    如何利用Java8 Stream API对Map按键或值排序

    Java 8 Stream API 的引入为处理集合数据提供了更高效、更简洁的方式,其中包括对Map的排序功能。在本文中,我们将深入探讨...通过结合使用Stream API和lambda表达式,Java 8为处理Map提供了一种高效且优雅的解决方案。

    java8,Steam API例子

    在Java 8中,几乎所有的集合接口(如List, Set, Map)都添加了默认方法来支持流操作。 在描述中提到的"Steam API",可能是指“Stream API”的打字错误。这个API提供了一系列静态方法,如`Stream.of()`, `Arrays....

    探索Java 8的Stream API:数据流处理的新纪元

    ### 探索Java 8的Stream API:数据流处理的新纪元 #### Java语言概览 Java作为一种广泛应用的编程语言,自1995年由Sun Microsystems(现属于Oracle公司)首次发布以来,就以其强大的功能和灵活性赢得了全球开发者...

    jdk8 中文版 api内容详细

    此外,Java 8的`Stream API`与`Collectors`类结合,提供了强大的数据聚合功能,如分组、过滤、求和等。例如,`list.stream().filter(e -&gt; e &gt; 10).collect(Collectors.toList())`可以获取列表中所有大于10的元素组成...

    Java8API chm格式

    这个“Java8 API chm格式”的文件是一个非常实用的参考资料,它包含了Java 8的所有公共API接口、类和方法,以及相关的文档说明。CHM(Compiled Help Manual)是一种微软提供的帮助文件格式,它将HTML文档编译成单一...

Global site tag (gtag.js) - Google Analytics