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

如何在Java中使用建造者模式优雅填充列表?

优化FieldValidationResponse的列表构建方式

我有一个采用建造者模式的FieldValidationResponse类:

public class FieldValidationResponse {

  private Integer status;

  private String message;

  private List<FieldValidationError> errors;
  
}

目前构建单个FieldValidationError的方式很简洁:

private FieldValidationResponse fieldValidationResponse(String responseMessage, String message) {
    return FieldValidationResponse.builder()
        .message(responseMessage)
        .status(400)
        .error(
            FieldValidationError.builder()
                .message(message)
                .build()
        )
        .build();
}

但构建多个错误时,原写法需要手动循环填充列表,不够优雅:

private FieldValidationResponse fieldValidationResponse2(String responseMessage, List<String> messages) {
    List<FieldValidationError> fieldValidationErrors = new ArrayList<>();
    for (String message : messages) {
        fieldValidationErrors.add(
            FieldValidationError.builder()
                .message(message)
                .build()
        );
    }

    return FieldValidationResponse.builder()
        .message(responseMessage)
        .status(400)
        .errors(fieldValidationErrors)
        .build();
}

优化方案

1. 用Stream API简化列表转换

借助Java Stream的map和collect操作,直接将字符串列表转换为FieldValidationError列表,省去显式循环:

private FieldValidationResponse fieldValidationResponse2(String responseMessage, List<String> messages) {
    List<FieldValidationError> fieldValidationErrors = messages.stream()
        .map(msg -> FieldValidationError.builder().message(msg).build())
        .collect(Collectors.toList());

    return FieldValidationResponse.builder()
        .message(responseMessage)
        .status(400)
        .errors(fieldValidationErrors)
        .build();
}

2. 扩展建造者类,添加批量/逐个添加错误的方法(推荐)

如果有权限修改FieldValidationResponse的建造者代码,可以给Builder类新增专门的错误添加方法,让调用更简洁:

首先扩展建造者:

// 给FieldValidationResponse.Builder添加以下方法
public Builder addErrors(List<String> messages) {
    this.errors = messages.stream()
        .map(msg -> FieldValidationError.builder().message(msg).build())
        .collect(Collectors.toList());
    return this;
}

// 支持逐个添加错误的链式调用
public Builder addError(String message) {
    if (this.errors == null) {
        this.errors = new ArrayList<>();
    }
    this.errors.add(FieldValidationError.builder().message(message).build());
    return this;
}

之后调用时可以直接链式操作:

// 批量添加错误
private FieldValidationResponse fieldValidationResponse2(String responseMessage, List<String> messages) {
    return FieldValidationResponse.builder()
        .message(responseMessage)
        .status(400)
        .addErrors(messages)
        .build();
}

// 动态逐个添加错误(适合参数为可变字符串的场景)
private FieldValidationResponse fieldValidationResponse3(String responseMessage, String... messages) {
    FieldValidationResponse.Builder builder = FieldValidationResponse.builder()
        .message(responseMessage)
        .status(400);
    for (String msg : messages) {
        builder.addError(msg);
    }
    return builder.build();
}

3. 给FieldValidationError添加静态工厂方法,进一步简化Stream

如果可以修改FieldValidationError类,新增一个静态工厂方法封装建造逻辑:

public class FieldValidationError {
    // 原有代码...
    
    public static FieldValidationError fromMessage(String message) {
        return builder().message(message).build();
    }
}

这样Stream的写法会更简洁:

List<FieldValidationError> fieldValidationErrors = messages.stream()
    .map(FieldValidationError::fromMessage)
    .collect(Collectors.toList());

内容的提问来源于stack exchange,提问作者Carlos Gonzalez

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 07:09:11