如何合并Map<Type1,Type2>与Map<Type3,Type1>得到Map<Type3,Type2>
问题分析与解决方案
你的核心问题是流的处理逻辑方向错误:你当前操作的是Type1类型的元素,而目标是构建Type3 -> Type2的映射,应该从map2的Type3键出发,通过关联的Type1去map1中获取对应值,而不是反过来从Type1反向查找Type3。
原代码的关键错误
- 数据源错误:将
map1.keySet()和map2.values()合并成Type1集合,导致后续无法直接关联到Type3; map2::get使用错误:map2的键是Type3,传入Type1类型的参数会返回null(或无意义值),完全不符合你需要的键映射逻辑。
正确实现代码
直接遍历map2的entrySet(每个元素包含Type3键和对应的Type1值),过滤出map1中存在对应Type1的条目,再收集为目标Map:
Map<Type3, Type2> result = map2.entrySet().stream() // 只保留map1中存在对应Type1的entry .filter(entry -> map1.containsKey(entry.getValue())) .collect(Collectors.toMap( Map.Entry::getKey, // 取map2的key作为结果的key(Type3类型) entry -> map1.get(entry.getValue()), // 取map1中对应Type1的value作为结果的value(Type2类型) // 保留你原来的冲突处理逻辑:当多个Type3对应同一个Type2时,保留非空的旧值 (v1, v2) -> StringUtils.isNotEmpty(v1) ? v1 : v2 ));
逻辑说明
- 遍历
map2的条目:直接获取Type3(键)和对应的Type1(值),这是构建目标Map的核心关联关系; - 过滤条件:确保只有
map1中存在对应Type1的条目才会被处理,避免出现null值; - 收集逻辑:直接映射
Type3到Type2,完全符合你的需求,同时保留了原有的冲突处理规则。
内容的提问来源于stack exchange,提问作者Bourg
相关产品推荐
相关产品推荐

