Java 8如何合并List中id相同的HashMap元素
合并实现方案
核心逻辑为:先将List中所有HashMap按id字段分组,同一id下的所有键值对合并到同一个HashMap中,最后将合并后的结果转成List即可。
方法1:通用遍历实现(兼容所有Java版本)
import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; public class MergeSameIdMap { public static void main(String[] args) { // 你的原始测试数据 List list1= new ArrayList(); HashMap details= new HashMap(); details.put("id", "305"); details.put("text1",true); list1.add(details); HashMap details2= new HashMap(); details2.put("id", "305"); details2.put("text2",true); list1.add(details2); // 按id存储合并后的HashMap Map<String, HashMap> mergeCache = new HashMap<>(); for (Object o : list1) { HashMap currentMap = (HashMap) o; String id = (String) currentMap.get("id"); // 该id首次出现时初始化缓存 if (!mergeCache.containsKey(id)) { HashMap newMergeMap = new HashMap(); newMergeMap.put("id", id); mergeCache.put(id, newMergeMap); } // 合并当前Map的所有键值对到缓存中 mergeCache.get(id).putAll(currentMap); } // 缓存的value就是合并后的结果,转成List即可 List<HashMap> result = new ArrayList<>(mergeCache.values()); // 打印验证结果 System.out.println(result); } }
方法2:Java 8+ Stream流式实现(代码更简洁)
import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.stream.Collectors; public class MergeSameIdMap { public static void main(String[] args) { // 你的原始测试数据 List list1= new ArrayList(); HashMap details= new HashMap(); details.put("id", "305"); details.put("text1",true); list1.add(details); HashMap details2= new HashMap(); details2.put("id", "305"); details2.put("text2",true); list1.add(details2); List<HashMap> result = new ArrayList<>(list1.stream() .map(item -> (HashMap) item) .collect(Collectors.toMap( map -> (String) map.get("id"), map -> map, (existingMap, newMap) -> { existingMap.putAll(newMap); return existingMap; } )).values()); // 打印验证结果 System.out.println(result); } }
注意:如果同一个id下存在相同名称的非id键,后续出现的键值会覆盖之前的同名键值,符合常规业务的合并逻辑。
内容的提问来源于stack exchange,提问作者Tejal
相关产品推荐
相关产品推荐

