You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 10:04:47