前言
本篇介绍Stream流List和Map互转,同时在转换过程中遇到的问题分析。
一、Map转List
1.1 分析
按照默认顺序
1 | java复制代码mapToList.entrySet().stream().map(a -> new User(a.getKey(), a.getValue())).collect(Collectors.toList()); |
根据key排序
1 | java复制代码mapToList.entrySet().stream().sorted(Comparator.comparing(a -> a.getKey())).map(a -> new User(a.getKey(),a.getValue())).collect(Collectors.toList()); |
根据key排序
1 | java复制代码mapToList.entrySet().stream().sorted(Map.Entry.comparingByKey()).map(a -> new User(a.getKey(),a.getValue())).collect(Collectors.toList()); |
根据key倒序排序
1 | java复制代码mapToList.entrySet().stream().sorted(Map.Entry.comparingByKey(Comparator.reverseOrder())).map(a -> new User(a.getKey(),a.getValue())).collect(Collectors.toList()); |
根据value排序
1 | java复制代码mapToList.entrySet().stream().sorted(Comparator.comparing(Map.Entry::getValue)).map(a -> new User(a.getKey(), a.getValue())).collect(Collectors.toList()); |
根据value倒序排序
1 | java复制代码mapToList.entrySet().stream().sorted(Collections.reverseOrder(Map.Entry.comparingByValue())).map(a -> new User(a.getKey(),a.getValue())).collect(Collectors.toList()); |
1.2 完整代码
实体类
1 | java复制代码/** |
Map转List代码
1 | java复制代码import java.util.*; |
运行结果
1 | json复制代码[User{id=1001, name='Leefs'}, User{id=1002, name='Jeyoo'}, User{id=1003, name='Thymee'}] |
二、List转Map
2.1 分析
指定key-value,value是对象中的某个属性值
1 | java复制代码userList.stream().collect(Collectors.toMap(User::getId, User::getName)); |
指定key-value,value是对象本身
User->User 是一个返回本身的lambda表达式
1 | java复制代码userList.stream().collect(Collectors.toMap(User::getId, User->User)); |
指定key-value,value是对象本身
Function.identity()是简洁写法,也是返回对象本身
1 | java复制代码userList.stream().collect(Collectors.toMap(User::getId, Function.identity())); |
指定key-value,key 冲突的解决办法
(key1,key2)->key2:第二个key覆盖第一个key
(key1,key2)->key1:保留第一个key
1 | java复制代码userList.stream().collect(Collectors.toMap(User::getId, Function.identity(),(key1,key2)->key2)); |
2.2 完整代码
1 | java复制代码import java.util.Arrays; |
运行结果
1 | json复制代码{1001=jeek, 1002=mack, 1003=keko} |
三、List转Map常见问题
3.1 常见问题
问题一
报错Duplicate key xxxx
该问题是因为在生成Map集合时key值重复造成的
解决方案
1. 后面的value覆盖前面的value
1 | java复制代码userList.stream().collect(Collectors.toMap(User::getId, User::getName, (key1, key2) -> key2)); |
也可以保留前面的value,将key2换成key1即可
2. value进行拼接
1 | java复制代码userList.stream().collect(Collectors.toMap(User::getId, User::getName, (key1, key2) -> key1+","+key2)); |
3. key重复时,返回集合
1 | java复制代码userList2and.stream().collect(Collectors.toMap(User::getId, p -> { |
问题二
报错:Exception in thread "main" java.lang.NullPointerException
该问题是因为在存入Map集合时value值为null
解决方案
在转换流中加上判空,即便value为空,依旧输出。(与上面方法三相同)
3.2 完整代码
1 | java复制代码import java.util.ArrayList; |
运行结果
1 | json复制代码{1001=teek, 1002=mack, 1003=keko} |
附:参考文章链接
本文转载自: 掘金