hs_bj
2018-06-25 06:30
采纳率: 79.2%
浏览 10.1k
已采纳

java 多重if判断怎么优化

if(id == null || id.isEmpty()){
if(type == null){
if(name==null || name.isEmpty()){
//...select..sql...
}else {
//...select..sql...
}
}else {
if(name==null || name.isEmpty()){
//...select..sql...
}else {
//...select..sql...
}
}
}else {
if(type == null){
if(name==null || name.isEmpty()){
//...select..sql...
}else {
//...select..sql...
}
}else {
if(name==null || name.isEmpty()){
//...select..sql...
}else {
//...select..sql...
}
}
}

  • 写回答
  • 好问题 提建议
  • 关注问题
  • 收藏
  • 邀请回答

18条回答 默认 最新

  • 叮当你去哪了 2018-06-25 08:05
    已采纳
    把4个重复的部分提出来,这样代码是否清晰些,一定要写好注释哦
    if (id == null || id.isEmpty()) {
                    if (type == null) {
                        getSql(1, name);
                    } else {
                        getSql(2, name);
                    }
    } else {
                    if (type == null) {
                        getSql(3, name);
                    } else {
                        getSql(4, name);
                    }
    

    }
    public String getSql(int state, List name) {
    switch (state) {
    case 1:
    if (name == null || name.isEmpty()) {
    // ...select..sql...
    } else {
    // ...select..sql...
    }
    case 2:
    if (name == null || name.isEmpty()) {
    // ...select..sql...
    } else {
    // ...select..sql...
    }
    case 3:
    if (name == null || name.isEmpty()) {
    // ...select..sql...
    } else {
    // ...select..sql...
    }
    case 4:
    if (name == null || name.isEmpty()) {
    // ...select..sql...
    } else {
    // ...select..sql...
    }
    }
    }

    已采纳该答案
    评论
    解决 无用
    打赏 举报
  • xypincle 2018-06-25 06:48

    自己把问题搞复杂了,实际上线上很少有复杂的语句,大多数情况都可以通过分解进行解决。

    评论
    解决 无用
    打赏 举报
  • Lei_Da_Gou 2018-06-25 06:59

    mybatis的动态sql应该是解决你这个问题的方式。

    评论
    解决 无用
    打赏 举报
  • 菜o籽 2018-06-25 07:16

    给个思路:1,在业务处理之前,把这些判断变量的if 写一个类方法,2.通过类方法的返回值判断变量。3,,间接的在业务逻辑处理之前把这些判断就做完。不要把变量的判断和业务逻辑放在一起

    评论
    解决 无用
    打赏 举报
  • weixin_37722689 2018-06-25 08:05

    if () return;

    //somecode

    不过你上面的代码我觉得没必要优化

    评论
    解决 无用
    打赏 举报
  • 叮当你去哪了 2018-06-25 08:07

    if (id == null || id.isEmpty()) {
    if (type == null) {
    getSql(1, name);
    } else {
    getSql(1, name);
    }
    } else {
    if (type == null) {
    getSql(3, name);
    } else {
    getSql(4, name);
    }
    }

     public String getSql(int state, List name) {
            switch (state) {
                case 1:
                    if (name == null || name.isEmpty()) {
                        // ...select..sql...
                    } else {
                        // ...select..sql...
                    }
                case 2:
                    if (name == null || name.isEmpty()) {
                        // ...select..sql...
                    } else {
                        // ...select..sql...
                    }
                case 3:
                    if (name == null || name.isEmpty()) {
                        // ...select..sql...
                    } else {
                        // ...select..sql...
                    }
                case 4:
                    if (name == null || name.isEmpty()) {
                        // ...select..sql...
                    } else {
                        // ...select..sql...
                    }
            }
        }
    
    评论
    解决 无用
    打赏 举报
  • jsumner 2018-06-25 08:08

    for(int i=0;i<5;i++){
    if(i==2){
    System.out.println("i==2时忽略了");
    continue;//忽略i==2时的循环
    }
    System.out.println("当前i的值为"+i);
    }

        for(int i =0;i<5;i++){
            System.out.println("当前i的值"+i);
            if(i==2){
                return;  //直接结束main()方法
            }
        }
    
        for(int i =0;i<5;i++){
            System.out.println("当前i的值"+i);
            if(i==2){
                break;  //直接结束for循环
            }
        }
    
    
        bgm:for(int i=0;i<2;i++){
                for(int j=0;j<4;j++){
                    System.out.println("当前i的值"+j);
                    if(j==2){
                        System.out.println("当前j的值="+j);
                        break bgm;//跳出外循环,给外循环起一个名字,然后使用break 名字  跳出外循环
                    }
                }
        }
    
    评论
    解决 无用
    打赏 举报
  • 叮当你去哪了 2018-06-25 08:09

    把4个重复的部分提出来,这样代码是否清晰些,一定要写好注释哦

     if (id == null || id.isEmpty()) {
                if (type == null) {
                    getSql(1, name);
                } else {
                    getSql(2, name);
                }
            } else {
                if (type == null) {
                    getSql(3, name);
                } else {
                    getSql(4, name);
                }
            }
    
     public String getSql(int state, List name) {
            switch (state) {
                case 1:
                    if (name == null || name.isEmpty()) {
                        // ...select..sql...
                    } else {
                        // ...select..sql...
                    }
                case 2:
                    if (name == null || name.isEmpty()) {
                        // ...select..sql...
                    } else {
                        // ...select..sql...
                    }
                case 3:
                    if (name == null || name.isEmpty()) {
                        // ...select..sql...
                    } else {
                        // ...select..sql...
                    }
                case 4:
                    if (name == null || name.isEmpty()) {
                        // ...select..sql...
                    } else {
                        // ...select..sql...
                    }
            }
        }
    
    评论
    解决 无用
    打赏 举报
  • gogo111007 2018-06-25 08:35

    如果判断条件相同,可以写个方法,用反射遍历所有需要检查的字段,做相同的检查和处理。

    评论
    解决 无用
    打赏 举报
  • weixin_41752508 2018-06-25 08:43

    看if之间的“包含”与“并列”关系,从而判断if之间的关系!

    评论
    解决 无用
    打赏 举报
  • sinat_40433751 2018-06-25 08:56

    if () return;

    //somecode

    不过你上面的代码我觉得没必要优化

    评论
    解决 无用
    打赏 举报
  • 季愈 2018-06-25 09:39

    这个具体情况具体处理。一个参考建议是判是改成判否。比如:
    if (boolean-expression1) {
    if(boolean-expression2) {
    doSomething();
    }
    }
    改成
    if (!boolean-expresssion1) {
    return;
    }
    if (boolean-expression2) {
    doSomething();
    }

    评论
    解决 无用
    打赏 举报
  • 曾经我的梦想很大 2018-06-25 09:41

    不管怎么判断,其实就是判断的地方可以有选择性,比如在页面上判断,比如java中判断,比如mybatis中判断。无非是这几种方式。如果以上30个字段都是必填项
    可以在页面中进行为空判断,使用插件。可以省掉很多代码量。

    评论
    解决 无用
    打赏 举报
  • 葫芦胡 2018-06-26 05:30

    你判断空应该是用来判断是否按此条件查询查询的吧,mybatis的动态sql就可以了。
    按照你写的我写了一个动态sql,你可以参考下,应该有用:

    SELECT * FROM TEST


    AND ID =#{ id }


    AND TYPE =#{ type }


    AND NAME =#{ name }


    评论
    解决 无用
    打赏 举报
  • 葫芦胡 2018-06-26 05:31

    SELECT * FROM TEST

    AND ID =#{ id }

    AND TYPE =#{ type }

    AND NAME =#{ name }

    评论
    解决 无用
    打赏 举报
  • 葫芦胡 2018-06-26 05:33

    xml竟然被影藏了,上个截图吧图片说明

    评论
    解决 无用
    打赏 举报
  • wb_it_man 2020-10-30 16:47

    你现在遇到的问题应该是,不同的情况下,你需要使用不同的sql语句。但是排列组合的数量上去了,你要写的if else就太多了。可以用拼接字符串的方法解决,如果需要就把where后的查询条件拼接,不需要就不进入。可以少些很多代码。如果你用到Hibernate的话,可以使用criteria,也可以解决。

    评论
    解决 无用
    打赏 举报
  • bangyiyu5394 2018-06-25 06:32

    目前需要写一个判断完整度的方法
    A实体类共有20个字段,其中12个字段参与计算,计作:a1到a12
    B实体类共有16个字段,其中8个字段参与计算,计作:b1到b8
    C实体类共有19个字段,其中10个字段参与计算,计作:c1到c10
    所有30个字段都不为空才算完整

    目前的判断语句为:

    if (!StringUtils.isEmpty(a1) && ...
    && !StringUtils.isEmpty(c10)){
    return true;
    }

    评论
    解决 无用 1
    打赏 举报

相关推荐 更多相似问题