首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Java8新特性Stream之list转map及问题解决[通俗易懂]

Java8新特性Stream之list转map及问题解决[通俗易懂]

作者头像
全栈程序员站长
发布于 2022-09-14 02:59:26
发布于 2022-09-14 02:59:26
4.8K01
代码可运行
举报
运行总次数:1
代码可运行

大家好,又见面了,我是你们的朋友全栈君。

List集合转Map,用到的是Stream中Collectors的toMap方法:Collectors.toMap 具体用法实例如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//声明一个List集合
List<Person> list = new ArrayList();  
        list.add(new Person("1001", "小A"));  
        list.add(new Person("1002", "小B"));  
        list.add(new Person("1003", "小C"));
        System.out.println(list);
//将list转换map
Map<String, String> map = list.stream().collect(Collectors.toMap(Person::getId, Person::getName));
        System.out.println(map);

输出结果为:

注意:用Collectors的toMap方法转换List,一般会遇到两个问题。一个是转换map,key重复问题;另一个是空指针异常,即转为map的value是null。 问题解决!!! 一、第一种问题报的错误如下:Duplicate key

原因是声明List集合时,有的值重复,如图:

解决方法:(分三种,具体哪种看业务需求) 1.重复时用后面的value 覆盖前面的value

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Map<String, String> map = list.stream().collect(Collectors.toMap(Person::getId, Person::getName,(key1 , key2)-> key2 ));
        System.out.println(map); 

输出结果:

2.重复时将前面的value 和后面的value拼接起来;

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Map<String, String> map = list.stream().collect(Collectors.toMap(Person::getId, Person::getName,(key1 , key2)-> key1+","+key2 ));
        System.out.println(map);

输出结果:

3.重复时将重复key的数据组成集合

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Map<String, List<String>> map = list.stream().collect(Collectors.toMap(Person::getId,
	    		p ->  {
	    		 	List<String> getNameList = new ArrayList<>();
	    		 		getNameList.add(p.getName());
	    		 		return getNameList;
	    		 	},
    		     	(List<String> value1, List<String> value2) -> {
    		     		value1.addAll(value2);
    		     		return value1;
    		     	}
	    		 ));
       
         System.out.println(map);

输出结果:

二、第二种问题报的错误如下:NullPointerException

原因是声明List集合时有的值为空(如图),但是HashMap中k,v是可以存null值的。

解决方法:在转换流中加上判空,即便value为空,依旧输出。(与上面方法三相同)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Map<String, List<String>> map = list.stream().collect(Collectors.toMap(Person::getId,
	    		p ->  {
	    		 	List<String> getNameList = new ArrayList<>();
	    		 		getNameList.add(p.getName());
	    		 		return getNameList;
	    		 	},
    		     	(List<String> value1, List<String> value2) -> {
    		     		value1.addAll(value2);
    		     		return value1;
    		     	}
	    		 ))
         System.out.println(map);

输出结果为:

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/159811.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
JAVA8新特性之List的各种用法(最大、最小、平均值、分组、求和、遍历、过滤、排序)
构建一个User实体类供演示 public class Users { /** * ID */ private Long id; /** * 用户名 */ private String name; /** * 年龄 */ private int age; /** * 工号 */ private String jobNumber; /** * 性别
Kevin_Zhang
2021/06/29
3.9K0
Java8之Stream之List转Map有哪些坑
Duplicate key 问题 当 key 值重复时会有这个问题,异常如下 Exception in thread "main" java.lang.IllegalStateException: Duplicate key 小C at java.util.stream.Collectors.lambda$throwingMerger$0(Unknown Source) at java.util.HashMap.merge(Unknown Source) at java.util.stream.Col
王小明_HIT
2020/05/08
5.4K0
Java8 用 Stream 快速实现List转Map 、分组、过滤等操作
这篇文章主要介绍了java8快速实现List转map 、分组、过滤等操作,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
搜云库技术团队
2020/09/01
26.5K0
Java8新特性之Stream流(含具体案例)
Stream 流是 Java 8 新提供给开发者的一组操作集合的 API,将要处理的元素集合看作一种流, 流在管道中传输, 并且可以在管道的节点上进行处理, 比如筛选、排序、聚合等。元素流在管道中经过中间操作(intermediate operation)的处理,最后由终端操作 (terminal operation) 得到前面处理的结果。Stream 流可以极大的提高开发效率,也可以使用它写出更加简洁明了的代码。我自从接触过 Stream 流之后,可以说对它爱不释手。
军军不吃鸡
2022/10/26
3K1
Java8新特性之Stream流(含具体案例)
Java 8 新特性|java.util.stream.Collectors
Java 8 流的新类 java.util.stream.Collectors 实现了 java.util.stream.Collector 接口,同时又提供了大量的方法对流 ( stream ) 的元素执行 map and reduce 操作,或者统计操作。
Java小技巧
2022/05/23
3720
4.1.java8新特性持续更新
记得我在以前找工作的经历中,遇到过一个面试官问过我一个很基础的问题。问题是:有一个List中有10个元素,我现在想从中删除3个元素,请问怎么做?我当时也没想,就直接说,List的有自带的remove方法,可以直接使用,他说请详细的说明一下,我说写一个for循环,循环的次数是List的长度,然后在循环里面直接删除掉想要删除的元素就可以了。
itjim
2019/11/22
4160
4.1.java8新特性持续更新
java8 stream().map().collect()的Collectors.toList()、Collectors.toMap()、Collectors.groupingBy()的用法[通俗易
  现在需要将这些user的id提取出来。这个很简单,for循环嘛,谁不会啊(不会吧不会吧,不会有人还不会用for循环的吧)。
全栈程序员站长
2022/09/24
3.8K0
java8 stream().map().collect()的Collectors.toList()、Collectors.toMap()、Collectors.groupingBy()的用法[通俗易
jdk8 Stream流中将集合转成map,重复key处理,统计最大值,获取某个属性集合等10种最常用方法
javaNice
2023/11/19
1.2K0
Java8 Stream,常用方法大合集
一、概述 二、分类 三、具体用法 1.流的常用创建方法 2.流的中间操作 3.流的终止操作
鱼找水需要时间
2023/02/16
5060
Java8 Stream,常用方法大合集
java8 Lambda Stream collect Collectors 常用实例
字典查询和数据转换 toMap时,如果value为null,会报空指针异常 解决办法一:
Erwin
2019/12/31
3.9K0
【小家java】java8新特性之---Stream API 详解 (Map-reduce、Collectors收集器、并行流、groupby多字段分组)
Stream 作为 Java 8 的一大亮点,它与 java.io 包里的 InputStream 和 OutputStream 是完全不同的概念。
YourBatman
2019/09/03
3.4K0
【小家java】java8新特性之---Stream API 详解  (Map-reduce、Collectors收集器、并行流、groupby多字段分组)
Java8新特性----Stream
map–接收Lambda,将元素转换为其他形式或提取信息,接收一个函数作为参数,该函数会被应用到每个元素上,并将其映射成一个新的元素
大忽悠爱学习
2021/11/15
5640
二十一、Java8新特性——Stream API【黑马JavaSE笔记】
文章 Stream流 (一)体验Stream流 (二)Stream流的生成方式 (三)Stream流的常见中间操作方法 1. filter 2. limit 和 skip 3.concat 和 distinct 4.sorted 5.map 和 mapToInt (四)Stream流的常见终结操作方法 (五)Stream流的练习 (六)Stream流的收集操作 Stream流 (一)体验Stream流 (二)Stream流的生成方式 代码演示: import java.util.*; impor
啵啵鱼
2022/11/23
3090
二十一、Java8新特性——Stream API【黑马JavaSE笔记】
Java基础(二十六):Stream流及Optional类
ps:集合中数据为空,会抛异常No value present,后面会将Optional类的空值处理
Java微观世界
2025/01/20
3430
Java基础(二十六):Stream流及Optional类
Java8使用Stream优雅地处理集合
集合和数组是我们经常会用到的数据结构,在jdk1.8之前,集合和数组的处理并不是很便捷。但是到了JDK1.8之后,使用Stream处理集合会使代码变得更加的简洁明了。作为一名开发者,其实很有必要学习新特性的用法,即使是说项目中没有采用。虽然JDK1.8已经发布数年,但是还是发现很多人都不会使用JDK1.8给我们带来的新的API。比如之前写过的一篇文章还在用SimpleDateFormat?Java8都发布N年了,转LocalDateTime吧,讲解了JDK1.8时间上的新API,大家也可以看看。
Happyjava
2024/02/02
1790
JDK8新特性-Stream流[通俗易懂]
作者是一个来自河源的大三在校生,以下笔记都是作者自学之路的一些浅薄经验,如有错误请指正,将来会不断的完善笔记,帮助更多的Java爱好者入门。
全栈程序员站长
2022/11/10
5820
【Java基础-1】 Java8新特性Stream详解
Java8的API中添加了一个新的特性: 流,即stream。stream是将数组或者集合的元素视为流,流在管道中流动过程中,对数据进行筛选、排序和其他操作。
云深i不知处
2020/09/16
1.3K0
使用 Java8的 stream对list数据去重,使用filter()过滤列表,list转map「建议收藏」
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/141093.html原文链接:https://javaforall.cn
全栈程序员站长
2022/08/24
4.5K0
Java8 新特性
Lambda 是一个匿名函数,我们可以把 Lambda 表达式理解为是一段可以传递的代码(将代码像数据一样进行传递)。可以取代大部分的匿名内部类,可以写出更简洁、更灵活的代码。尤其在集合的遍历和其他集合操作中,可以极大地优化代码结构。作为一种更紧凑的代码风格,使 Java 的语言表达能力得到提升。JDK 也提供了大量的内置函数式接口供我们使用,使得 Lambda 表达式的运用更加方便、高效。 【1】从匿名类到 Lambda 的转换:虽然使用 Lambda 表达式可以对某些接口进行简单的实现,但并不是所有的接口都可以使用 Lambda 表达式来实现。Lambda 规定接口中只能有一个需要被实现的方法,不是规定接口中只能有一个方法。
Java架构师必看
2021/05/14
1K0
Java8 新特性
Stream & JDK8新特性
我们日常SQL使用的时候,都是Group By实现分组。Stream也有类似功能,比如一个集合有3个组的员工,我们想获取每个组的员工,就可以通过.collect(Collectors.groupingBy(Obj::getXXX));实现。返回的集合是Map集合!
收心
2022/11/11
2870
Stream & JDK8新特性
推荐阅读
相关推荐
JAVA8新特性之List的各种用法(最大、最小、平均值、分组、求和、遍历、过滤、排序)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验