JAVA-简化多条件判断(IF)
使用场景:
我主要在导入数据的时候需要校验很多数据的安全行,例如:是否为空,数据格式是否正确,数据关联关系是否正确,这些都需要很多的if判断,导致看起来很怪。多IF判断也可以使用策略模式+工厂模式进行优化,可是这种简单判断用设计模式感觉大题小作了,于是想了以下的解决办法。
实现思路:
自定义规则实体类添加校验规则,通过Supplier函数式接口写判断的业务逻辑并返回Boolean类型,然后获取Supplier的结果来判断是否返回结果,这只是一个小思路,代码比正常多if判断能简介一些,对于性能来说还不能保障,如果有大神有思路可以提一提思路哈。
代码如下:
自定义规则实体类
public class PersonRule {
private String fieldName;
private Supplier<Boolean> condition;
private String errorMessage;
// 构造函数
public PersonRule(String fieldName, Supplier<Boolean> condition, String errorMessage) {
this.fieldName = fieldName;
this.condition = condition;
this.errorMessage = errorMessage;
}
// 获取字段名
public String getFieldName() {
return fieldName;
}
// 执行校验条件
public boolean validate() {
return condition.get();
}
// 获取错误信息
public String getErrorMessage() {
return errorMessage;
}
}
自定义实体类
@Data
public class Person implements Serializable {
/**
* 主键
*/
@TableId(type = IdType.AUTO)
private Integer id;
/**
* 名称
*/
@Excel(name = "姓名",width = 15)
private String name;
/**
* 性别
*/
@Excel(name = "性别",width = 15)
private String sex;
/**
* 年龄
*/
@Excel(name = "年龄",width = 15)
private String age;
/**
* 时间
*/
@Excel(name = "时间",width = 15)
private Date time;
/**
* 校验错误信息
*/
@TableField(exist = false)
private String failStr;
}
校验工具类
@Component
public class RuleEngineIf {
/**
* 校验单人
* @param person 校验实体类
* @return 完整错误信息
*/
public String checkPersonRule(Person person) {
StringBuilder failStr = new StringBuilder();
// 定义校验规则
List<PersonRule> rules = initRule(person);
executeRules(rules, failStr);
return failStr.toString();
}
/**
* 校验多人
* @param list 校验实体类集合
* @return 完整错误信息
*/
public List<Person> checkPersonListRule(List<Person> list,List<String> failList) {
// 正确数据
List<Person> personList = new ArrayList<>();
list.forEach(person -> {
StringBuilder failStr = new StringBuilder();
// 定义校验规则
List<PersonRule> rules = initRule(person);
executeRules(rules, failStr);
// 正确数据
personList.add(person);
// 错误信息
if (CharSequenceUtil.isNotBlank(failStr)){
failList.add(failStr.toString());
}
});
return personList;
}
/**
* 定义校验规则
*/
private List<PersonRule> initRule(Person person) {
List<PersonRule> rules = new ArrayList<>(3);
// 这里校验比较简单,只是判断是否为空判断,可以在方法体里面写自己的业务逻辑
rules.add(new PersonRule("年龄", () -> StringUtils.isEmpty(person.getAge()), "【年龄】不能为空"));
rules.add(new PersonRule("姓名", () -> Objects.isNull(person.getName()), "【姓名】不能为空"));
rules.add(new PersonRule("性别", () -> StringUtils.isEmpty(person.getSex()), "【性别】不能为空"));
return rules;
}
/**
* 执行校验规则
* @param rules 自定义规则类
* @param failStr 错误信息
*/
public void executeRules(List<PersonRule> rules, StringBuilder failStr) {
for (PersonRule rule : rules) {
if (rule.validate()) {
failStr.append(rule.getErrorMessage()).append(";");
}
}
}
}
**结束语:**只是脑子一热的想法,应该还有其他的缺点,如果有优化多IF判断的思路或者想法请多多指教!