简化多条件IF

文章提出了在JAVA中简化多条件判断的方法,通过创建自定义规则实体类,结合Supplier函数式接口来定义校验逻辑,从而替代复杂的IF判断结构。这种方法使得代码更简洁,但对性能影响尚未确认。作者希望得到更多关于优化多IF判断的建议。
摘要由CSDN通过智能技术生成

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判断的思路或者想法请多多指教!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值