if 判断太多,有什么好办法优化吗?

问题遇到的现象和发生背景

不能直接抛出异常或者提前return的
不能直接抛出异常或者提前return的
不能直接抛出异常或者提前return的
这个是大致的流程

img

需要三重判断,大概逻辑是判断字符串是否为空,不为空,执行查询语句,结果再判断是否为空,不为空添加进对象内,并且修改标志为false

问题相关代码,请勿粘贴截图
public static void main(String[] args) {
        boolean flag = true;
        //根据主键查数据
        String byId = "111";
        //s是byId的一个字段,不只是根据s查数据,还有x,y,z等也是需要查的
        String s = "";
        //list 是根据字段查出的数据
        List<String> list = new ArrayList<>();
        if (StringUtils.isNotEmpty(byId)) {
            if (StringUtils.isNotEmpty(s)) {
                System.out.println("查询语句,得到集合");
                if (CollectionUtil.isNotEmpty(list)) {
                    //不只是需要这个标志物,也需要list等,所以不能直接return什么的
                    flag = false;
                }
            }
            
        }
        //这只是一个大概的逻辑
        System.out.println(flag);
    }

运行结果及报错内容

已经顺利达到想要的结果

我的解答思路和尝试过的方法
我想要达到的结果

有其他思路,少用if判断吗,这个接口返回的数据较多,我的判断有点多,其中有一个if 包含 16个if 这16个if每个里面还有一个,有什么办法看起来美观一点吗

给个思路:
可以对数据异常点(字符串为空,集合为空,某字段不存在等)进行捕获,有异常直接抛出自定义异常再全局捕获进行处理

异常也可以用断言直接抛

Assert.notEmpty(new ArrayList<>(), "集合不能为空");

大致思路

     public static void main(String[] args) {
        boolean flag = true;
        //根据主键查数据
        String byId = "111";
        //s是byId的一个字段,不只是根据s查数据,还有x,y,z等也是需要查的
        String s = "";
        //list 是根据字段查出的数据
        List<String> list = new ArrayList<>();
        if (StrUtil.isEmpty(byId)){
            // TODO: 2022/5/20 抛异常 
            System.out.println(flag);
            return;
        }
        if (StrUtil.isEmpty(s)){
            System.out.println(flag);
            return;
        }
        System.out.println("查询语句,得到集合");
        if (CollectionUtil.isEmpty(list)){
            System.out.println(flag);
            return;
        }
        flag =false;
        System.out.println(flag);

      }

你目前的这个例子是没办法了,因为你每一步都是下一步的前置条件,中间还有步骤,没啥好办法优化了,但是你后边说的16组if,如果判断条件类似,可以考虑单独写一个方法封装一下,具体的看不到具体代码,没法提更多建议了

如果 if 都没有else的逻辑,那可以直接if 你现在相反的判断,然后里面return

方法一 if (!StringUtils.isNotEmpty(byId)) { return; } 不满足的话直接返回
方法二 自定义判断方法boolean isValid(xx1,xx2,xx3)

这个需求是已经解决了,就是看各位资深大佬有没有优化的方法,我学习下🤗

看不到具体的代码,前面的逻辑就不说了,关于你说的16个if,如果类似,可以试试使用map改写,可以稍微美观一点。

Stream流+Optional?

你的代码

if(条件1)
{
    if(条件2)
    {
        if(条件3)
        {
                //数据处理
        }
    }
}

其实代码等价于

if(条件1 && 条件2 && 条件3)
{
//处理
}

我们知道,与等价于或非,那么可以重新写为

if(!条件1)
{
//异常处理
}
else if(!条件2)
{
//异常处理
}
else if(!条件3)
{
//异常处理
}
else
{
//数据处理
}