Java中合并仅单个字段不同的两个类为含集合字段的类
简洁实现方案:合并Class A和B为Class C
嘿,这个对象合并的场景挺常见的,用Java原生API就能优雅搞定,完全不用额外依赖。我给你两种简洁的实现思路,按需选择:
前提:先定义好类结构
首先明确基础类(省略构造器、getter/setter和toString,实际开发中记得补上):
// 原类A class ClassA { private String s1; private String s2; } // 原类B class ClassB { private String s1; private String s3; } // 目标类C class ClassC { private String s1; private List<String> values; // 存储S2、S3的内容 }
方案一:用Stream API链式合并(最简洁的原生写法)
利用Stream的concat、groupingBy可以链式调用完成合并,逻辑清晰:
// 假设已有List<ClassA> listA和List<ClassB> listB List<ClassC> mergedList = Stream.concat( // 将ClassA转换为(s1, s2)的键值对 listA.stream().map(a -> new AbstractMap.SimpleEntry<>(a.getS1(), a.getS2())), // 将ClassB转换为(s1, s3)的键值对 listB.stream().map(b -> new AbstractMap.SimpleEntry<>(b.getS1(), b.getS3())) ) // 按s1分组,收集所有对应的值到List .collect(Collectors.groupingBy( Map.Entry::getKey, Collectors.mapping(Map.Entry::getValue, Collectors.toList()) )) // 将分组后的Map转换为ClassC列表 .entrySet().stream() .map(entry -> new ClassC(entry.getKey(), entry.getValue())) .collect(Collectors.toList());
亮点:完全链式调用,代码紧凑可读性强,原生API无依赖。如果需要去重,把Collectors.toList()换成Collectors.toSet()再转成List即可。
方案二:用HashMap手动合并(适合不熟悉Stream的场景)
借助Java 8+的computeIfAbsent方法,手动处理也很简洁:
Map<String, List<String>> tempMap = new HashMap<>(); // 处理ClassA的元素:s1不存在则创建空List,再添加s2 listA.forEach(a -> tempMap.computeIfAbsent(a.getS1(), k -> new ArrayList<>()).add(a.getS2())); // 处理ClassB的元素:同理添加s3 listB.forEach(b -> tempMap.computeIfAbsent(b.getS1(), k -> new ArrayList<>()).add(b.getS3())); // 转换为ClassC列表 List<ClassC> mergedList = tempMap.entrySet().stream() .map(entry -> new ClassC(entry.getKey(), entry.getValue())) .collect(Collectors.toList());
亮点:逻辑直观,每一步都清晰,computeIfAbsent完美解决“主键不存在则初始化列表”的问题,代码量极少。
内容的提问来源于stack exchange,提问作者johnny-b-goode
相关产品推荐
相关产品推荐

