如何在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
相关产品推荐
相关产品推荐

