详解Java8新特性Stream之list转map及问题解决
时间:2019-09-19
本文章向大家介绍详解Java8新特性Stream之list转map及问题解决,主要包括详解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("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
Map<String, String> map = list.stream().collect(Collectors.toMap(Person::getId, Person::getName,(key1 , key2)-> key2 )); System.out.println(map);
输出结果:
2.重复时将前面的value 和后面的value拼接起来;
Map<String, String> map = list.stream().collect(Collectors.toMap(Person::getId, Person::getName,(key1 , key2)-> key1+","+key2 )); System.out.println(map);
输出结果:
3.重复时将重复key的数据组成集合
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为空,依旧输出。(与上面方法三相同)
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);
输出结果为:
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Android屏蔽软键盘并且显示光标的实例详解
- Android实现底部缓慢弹出菜单
- Ubuntu20的tzselect设置时间失效的问题,树莓派服务器(推荐)
- 安装Ubuntu 20.04后要做的事(小白教程)
- Ubuntu20.04安装Python3的虚拟环境教程详解
- Android编程实现播放视频时切换全屏并隐藏状态栏的方法
- Android UI设计与开发之仿人人网V5.9.2最新版引导界面
- PopupWindow使用方法详解
- Android 中cookie的处理详解
- Android UI设计与开发之ViewPager仿微信引导界面以及动画效果
- Android UI设计与开发之ViewPager介绍和简单实现引导界面
- Android RollPagerView实现轮播图
- Android UI设计与开发之使用ViewPager实现欢迎引导页面
- Android ListView里控件添加监听方法的实例详解
- Android实现底部图片选择Dialog