Lombok @Builder转换对象时如何忽略字段为null的无效对象
实现方案
首先明确:@Builder注解仅用于简化Java对象构造的样板代码,本身不提供数据校验、空值过滤的能力,你当前代码的核心问题是把批量数据遍历过滤和单对象字段映射两个逻辑混在了一起,且没有拆分ExternalVehicles里的单条车辆条目,按以下要点调整即可:
- 拆分数据层级:先从
ExternalVehicles容器对象中取出所有10条单条车辆记录的集合,不要直接在整个容器对象上提取字段构造单条Car - 遍历单条车辆记录时,提前提取
plateNumber字段做非空判断,值为null直接通过continue跳过当前条目的转换 - 对非空的有效条目,再通过Builder构造Car对象,收集到最终结果集合中
修正后代码示例
public class CarConverter { /** * 批量转换有效车辆数据 * @param vehicles 外部服务返回的车辆容器对象 * @return 过滤掉车牌为空的有效Car对象集合 */ public List<Car> convertValidCars(ExternalVehicles vehicles) { List<Car> validCarList = new ArrayList<>(); // 替换成你实际从ExternalVehicles中获取单条车辆记录列表的方法 List<ExternalVehicleItem> itemList = vehicles.getVehicleRecords(); for (ExternalVehicleItem singleItem : itemList) { // 提前提取车牌做非空判断,空值直接跳过 String plateNumber = extractFieldFromItem(singleItem, "plateNumber"); if (plateNumber == null) { continue; } // 有效数据通过Builder构造对象 Car car = Car.builder() .plateNumber(plateNumber) .brand(extractFieldFromItem(singleItem, "brand")) .build(); validCarList.add(car); } return validCarList; } /** * 从单条车辆记录中提取对应字段值,替换成你原有的字段提取逻辑即可 */ private String extractFieldFromItem(ExternalVehicleItem item, String fieldKey) { // 保留你原有从嵌套对象取字段的实现逻辑 } // 可选:单独抽离单条Car构造逻辑,注意入参是单条车辆记录而非整个容器 private Car buildCarFromItem(ExternalVehicleItem item) { return Car.builder() .plateNumber(extractFieldFromItem(item, "plateNumber")) .brand(extractFieldFromItem(item, "brand")) .build(); } }
补充说明
- 如果你需要从根源上避免构造出车牌为空的Car对象,可以在Car类的
plateNumber字段上添加@lombok.NonNull注解,添加后Builder构造时如果传入null会直接抛出NullPointerException,防止无效对象流入下游业务,但这个注解仅做合法性校验,不能替代遍历层的空值跳过逻辑。 - 原写法的问题在于直接把包含10条数据的整个容器对象传入转换逻辑,无法定位具体哪条数据的字段为空,必须先拆分单条记录再做处理。
内容的提问来源于stack exchange,提问作者fat_pikachu
相关产品推荐
相关产品推荐

