Java中如何优化多变量非空校验逻辑?
Java中如何优化多变量非空校验逻辑?
嘿,看你这段校验代码确实有点冗长,不仅看着累,后续加字段或者改规则也麻烦,我给你几个实用的优化思路,你可以根据项目实际情况挑选:
1. 用Stream批量校验,让代码更整洁
把所有需要校验的字段放进一个列表,借助Stream的anyMatch方法快速判断是否存在空字段,结构清晰,维护起来也方便:
import java.util.Arrays; import java.util.List; // 把需要校验的字段统一放进列表 List<String> requiredFields = Arrays.asList( v.getEmail(), v.getPrinFirstName(), v.getPrinLastName(), v.getPrinAddrStreet(), v.getPrinAddrCity(), v.getPrinAddrPostalCode(), v.getPrinAddrState(), v.getPrinAddrCountry(), v.getPrinPhone(), v.getSsn(), v.getDbaName(), v.getDbaAddrStreet(), v.getDbaAddrCity(), v.getDbaAddrPostalCode(), v.getDbaAddrState(), v.getDbaAddrCountry(), v.getDbaPhone(), v.getLglName(), v.getLglAddrStreet(), v.getLglAddrCity(), v.getLglAddrPostalCode(), v.getLglAddrState(), v.getLglAddrCountry(), v.getLglPhone(), v.getTaxId() ); // 只要有一个字段为空就抛出异常 if (requiredFields.stream().anyMatch(String::isEmpty)) { throw new BadRequestException("BAD_REQUEST"); }
以后要新增校验字段,直接往列表里加就行,不用修改长长的条件判断。
2. 封装自己的校验工具方法
写一个通用的工具类,把多字段非空校验的逻辑抽出来,复用性拉满:
public class ValidationUtils { // 检查传入的字符串是否有任意一个为空(可根据需求改成isBlank()排除空格) public static boolean hasEmptyString(String... strings) { for (String s : strings) { if (s == null || s.isEmpty()) { return true; } } return false; } }
调用的时候就非常简洁:
if (ValidationUtils.hasEmptyString( v.getEmail(), v.getPrinFirstName(), v.getPrinLastName(), v.getPrinAddrStreet(), v.getPrinAddrCity(), v.getPrinAddrPostalCode(), v.getPrinAddrState(), v.getPrinAddrCountry(), v.getPrinPhone(), v.getSsn(), v.getDbaName(), v.getDbaAddrStreet(), v.getDbaAddrCity(), v.getDbaAddrPostalCode(), v.getDbaAddrState(), v.getDbaAddrCountry(), v.getDbaPhone(), v.getLglName(), v.getLglAddrStreet(), v.getLglAddrCity(), v.getLglAddrPostalCode(), v.getLglAddrState(), v.getLglAddrCountry(), v.getLglPhone(), v.getTaxId() )) { throw new BadRequestException("BAD_REQUEST"); }
3. 用注解式校验(推荐大型项目)
如果你的项目可以引入Bean Validation相关依赖(比如Hibernate Validator),用注解标记字段的校验规则,能把校验逻辑和业务逻辑彻底分离:
首先给ValidateBankAccountRequest类的字段加上校验注解:
import javax.validation.constraints.NotEmpty; public class ValidateBankAccountRequest { @NotEmpty(message = "邮箱不能为空") private String email; @NotEmpty(message = "负责人名不能为空") private String prinFirstName; // 其他所有需要校验的字段都加上@NotEmpty注解... // 记得编写getter和setter方法 }
然后在业务代码里用Validator触发校验:
import javax.validation.Validation; import javax.validation.Validator; import javax.validation.ValidatorFactory; import java.util.Set; ValidatorFactory factory = Validation.buildDefaultValidatorFactory(); Validator validator = factory.getValidator(); // 对传入的请求对象执行校验 Set<ConstraintViolation<ValidateBankAccountRequest>> violations = validator.validate(v); if (!violations.isEmpty()) { // 可以收集错误信息返回,也直接抛出异常 throw new BadRequestException("BAD_REQUEST"); }
这种方式不仅代码干净,还能返回更详细的错误提示,比如具体哪个字段为空,排查问题更高效。
4. 借助第三方工具类(省事首选)
如果你的项目已经引入了Apache Commons Lang库,直接用StringUtils.isAnyEmpty方法就行,人家已经封装好了成熟的逻辑:
import org.apache.commons.lang3.StringUtils; if (StringUtils.isAnyEmpty( v.getEmail(), v.getPrinFirstName(), v.getPrinLastName(), // 其他字段... )) { throw new BadRequestException("BAD_REQUEST"); }
要是需要把纯空格也视为无效值,就换成StringUtils.isAnyBlank方法,比自己写逻辑省心多了。
最后提个小细节:你现在用的是isEmpty(),如果字段是纯空格的话,isEmpty()会返回false,但业务上可能需要把空格也当成无效值,这时候可以换成isBlank()(Java 11+原生支持,或者用第三方工具类的同名方法)。
备注:内容来源于stack exchange,提问作者Pulkit Agrawal
相关产品推荐
相关产品推荐

