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

如何用Lombok Builder从已有值对象创建更新集合属性的新实例

问题原因与解决方案

问题根源

你遇到的问题是Lombok @Singular 注解的特性导致的:当用@Singular标记集合字段时,生成的Builder(包括toBuilder()创建的Builder)会默认继承原实例的集合元素,且复数形式的skills(Collection)方法是追加元素到现有集合,而非直接替换整个集合。因此调用.skills(Collections.emptySet())不会产生变化——空集合没有元素可追加。

解决方法

Lombok为@Singular字段自动生成了clearSkills()方法,用于清空集合状态,之后再设置新集合或直接构建即可实现替换:

1. 清空集合(得到空skills)

修改降级代码如下:

Person johnDowngraded = johnUpgraded.toBuilder()
        .clearSkills()
        .build();

此时输出会变为:

Person(name=John, skills=[])

2. 替换为指定集合

如果需要替换为非空的新集合,先清空再添加目标集合的元素:

Person johnReplaced = johnUpgraded.toBuilder()
        .clearSkills()
        .skills(Set.of("Python", "Django"))
        .build();

这样得到的实例skills就是[Python, Django]。

额外说明

如果不想依赖clearSkills(),也可以手动创建新Builder而非使用toBuilder(),直接构建全新实例:

Person johnDowngraded = Person.builder()
        .name(johnUpgraded.getName())
        .skills(Collections.emptySet())
        .build();

但这种方式需要手动复制所有其他字段,不如toBuilder() + clearSkills()简洁。

内容的提问来源于stack exchange,提问作者Игорь Маркивский

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 00:42:14