List转换Map的一些操作
一、List转Map
1. List 转 Map<Integer,List>
Map<Integer, List<User>> subLineInfoMap = userInfos .stream().collect(Collectors.groupingBy(User::getSex));
2. List 转 Map<Integer,User>
Map<Long, User>userMap = userInfos.stream().collect(Collectors.toMap(User::getStuNum,Function.identity()));
3. List 转 Map<Integer,String>
Map<Integer, String> collect = userInfos.stream().collect(Collectors.toMap(User::geUserNum, User::getUserName));
4. list 转 map 保持顺序
LinkedHashMap<String, User> userMap = users.stream().collect(LinkedHashMap::new, (map, item) -> map.put(item.getAccountId(), item), Map::putAll);
5. 将list转成map 并排序
将list 排序,并按照排序后的结果进行有序分组
LinkedHashMap<String, List<AlarmData>> alarmMap = alarmDataList.stream().sorted(Comparator.comparing(t->t.getId().getData_time())).collect(Collectors.groupingBy(t->t.getId().getVirtualPointId(), LinkedHashMap::new, Collectors.toList()));
将map排序,并且每个key对应的list里面也是排序好的
6. 我们在利用Lambda 将list转成Map时就会出现 Duplicate key xxxx 的异常,意思就是对要转为map的key有重复了,除了进行for循环去重之外,我们还有其它方式能够优雅的处理它.
key重复时直接用后面的值(使用最新的或最老的值)
Map<String, Long> collect = list.stream().collect(Collectors.toMap(User::getExternalUserId, User::getUserId, (val1, val2) -> val2));
将两个值拼接起来
Map<String, Long> collect = list.stream().collect(Collectors.toMap(User::getExternalUserId, User::getUserId, (val1, val2) -> val1+val2));
将重复key的value变成一个集合,注意null值处理
Map<String, List<String>> tagMap = list.stream().collect(Collectors.toMap(User::getExternalUserId, s -> { List<String> tags = new ArrayList<>(); tags.add(s.getFollowTags()); return tags; }, (List<String> val1, List<String> val2) -> { val1.addAll(val2); return val1; } ));
list中有null元素的话会报错
对于处理的对象的属性为null的话,也可以进行,就是把null一起带进来
Person p1 = new Person(1, "张三", 16);
Person p2 = new Person(1, "李四", 16);
Person p3 = new Person(2, "王五", 16);
Person p4 = new Person(3, "张六", 16);
Person p5 = new Person(1, "张三", 16);
Person p7 = new Person(2, null, 16);
Person p8 = new Person(4, null, 16);
Person p9 = null;
ps.removeAll(Collections.singleton(null));
Map<Integer, List<String>> personmap = ps.stream().collect(Collectors.toMap(Person::getId, s -> { List<String> names = new ArrayList<>(); names.add(s.getName()); return names; }, (List<String> v1, List<String> v2) -> { v1.addAll(v2); return v1; } ));
System.out.println(personmap.toString());
这段代码输出
{1=[张三, 李四, 张三], 2=[王五, null], 3=[张六], 4=[null]}
结果不带null的处理
Map<Integer, List<String>> personmap = ps.stream().collect(Collectors.toMap(Person::getId, s -> { List<String> names = new ArrayList<>(); if(s.getName()!=null){ names.add(s.getName()); } return names; }, ( v1, v2) -> { v1.addAll(v2); HashSet h = new HashSet(v1); v1.clear(); v1.addAll(h); return v1; } ));
System.out.println(personmap.toString());
这段代码输出
{1=[李四, 张三], 2=[王五], 3=[张六], 4=[]}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~