精华内容
下载资源
问答
  • if(id == null || id.isEmpty()){ if(type == null){ if(name==null || name.isEmpty()){ //...select..sql... }else { //...select..sql... } }else { if(name==null || name....
  • 多重if选择结构的代码优化

    有下面代码:

    if(status="0"){
        text="a";
    }else if(status="1"){
        text="b"
    }else if(status="2"){  
        text="c"
    }

    可以写出下面这样子:

    switch(status){
        case0’:
            text="a";
            break;
         case '1':
             text="b";
             break;
          case '2':
              text = "c";
              break;
    }

    最好的方法是下面的样子:

    设置一个数组
    arr[]={"a", "b", "c"}
    for(int i =0;i<arr.length;i++){
        text =arr[i]
    }

    Reference:
    http://blog.csdn.net/sameen916/article/details/50860777

    展开全文
  • 多重判断条件IF优化

    2020-05-07 17:00:36
    IF多重条件逻辑优化事例一:比较简单的if逻辑嵌套事例二:复杂场景的if逻辑嵌套代码抽象:递进式的条件及对应的业务处理总结 含义: c1:条件1,值为true c2:条件2,值为true c3:条件3,值为true 事例一:比较...


    含义:

    • c1:条件1,值为true
    • c2:条件2,值为true
    • c3:条件3,值为true

    事例一:比较简单的if逻辑嵌套

    代码抽象:递进式的条件

    // 方法开始
    ...
    if (c1) {
    	if (c2) {
    		if (c3) {
    			// 业务逻辑
    		}
    	}
    }
    // 方法结束
    

    优化后的代码逻辑:

    // 方法开始
    ...
    if (!c1) {
    	return;
    }
    if (!c2) {
    	return;
    }
    // 业务逻辑处理
    // 方法结束
    

    事例二:复杂场景的if逻辑嵌套

    代码抽象:递进式的条件及对应的业务处理

    // 方法开始
    ...
    ...
    if (c1) {
    	// 业务逻辑一
    	if (c2) {
    		// 业务逻辑二
    		if (c3) {
    			// 业务逻辑三
    		}
    		// 业务逻辑四
    	}
    	// 业务逻辑五
    }
    // 业务逻辑六
    // 方法结束
    

    优化后的代码逻辑:

    // 业务逻辑抽取独立的方法
    m1() {
    	// 业务逻辑一
    }
    m2() {
    	// 业务逻辑二
    }
    m3() {
    	// 业务逻辑三
    }
    m4() {
    	// 业务逻辑四
    }
    m5() {
    	// 业务逻辑五
    }
    m6() {
    	// 业务逻辑六
    }
    
    // 重构的方法内部开始
    ...
    ...
    if (!c1) {
    	m6();
    	return;
    }
    m1();
    if (!c2) {
    	m5();
    	m6();
    	return;
    }
    m2();
    if (c3) {
    	m3();
    	m4();
    	m5();
    	m6();
    	return;
    }
    m4();
    m5();
    m6();
    // 方法结束
    

    事例三:并列下IF条件逻辑表达式固定的优化

    事例:

    if (param.equals(val1)) {
    	doAction1(someParams);
    } else if (param.equals(val2)) {
        doAction2(someParams);
    } else if (param.equals(val3)) {
        doAction3(someParams);
    }
    

    用表驱动来优化,这个基于表驱动的方式来优化if-else逻辑在Spring中的应用场景很常见,比如NamespaceHandler中注册各种BeanDefinitionParser。Spring的表驱动方式是采用了集中注册的方式,在NamespaceHandlerSupport中。

    // 创建值跟动作的映射表
    Map<?, Function<?> action> actionMappings = new HashMap<>();
    // 存放映射关系
    actionMappings.put(val1, (someParams) -> doAction1(someParams));
    actionMappings.put(val2, (someParams) -> doAction2(someParams));
    actionMappings.put(val3, (someParams) -> doAction3(someParams));
    
    // 获取对应的Funtion,并将someParams入参传到对应的Function中去,省略为null的判断
    actionMappings.get(param).apply(someParams);
    

    事例四:if-else中的条件表达式灵活多变

    如果if-else中的条件表达式灵活多变,无法进行数据抽象为表格的方式,经常会用责任链设计模式。Spring Web常见的应用是Interceptor机制。

    事例五:进行null值判断的if-else条件简化,注解驱动

    我们在进行方法传参的时候,经常需要对方法参数作非空判断,可以在方法参数签名中添加@NotNull注解等

    事例六:Assert模式【Bean Validation】

    事例七:Optional,表示可为空的对象

    总结

    我们经常不可避免的在代码中写很多的if条件语句,甚至,会形成多重嵌套的if条件结构。掌握IF条件能力,有两点:

    1. 首先,有递进式的逻辑关系,改成并列式的逻辑关系【取反逻辑】
    2. 其次,if条件中的业务逻辑处理适当的抽取为独立的方法。
    3. 在递进式跟并列式的if条件取舍中,还要掌握一个维度,代码简洁。
    4. if条件个数尽量不要多
    5. 在事例二中的if(c3)逻辑没有再次取反逻辑,是考虑了这一点,if条件内的是执行几率较少的情况。
    展开全文
  • 多重if判断简单优化

    千次阅读 2020-01-20 16:48:57
    一、最笨重的 维护看起来很难受 public class Test { private static String getPrice(String fruit) { if ("梨".equals(fruit)) { return "梨价格"; } else if ("苹果".equals(fruit)) { ...

    一、最笨重的
    维护看起来很难受

    public class Test {
    
    
        private static String getPrice(String fruit) {
            if ("梨".equals(fruit)) {
                return "梨价格";
            } else if ("苹果".equals(fruit)) {
                return "苹果价格";
            } else {
                return "桃价格";
            }
        }
    
        public static void main(String[] args) {
            //System.out.println(TypeEnum.getPrice("梨"));
            //System.out.println(FruitFactory.getType("梨").price());
            System.out.println(getPrice("梨"));
        }
    
    
    }
    

    二、枚举类判断
    维护起来只需要添加修改枚举类,无需动其他的。
    当枚举很多并且自定义方法很多时,性能会下降,且方法会很长,一拉一大串。二三十个枚举以下都可以用吧

    public enum TypeEnum {
    
        DEFEND("异常") {
            @Override
            public String price() {
                return "我是异常的价格";
            }
        },
    
        PEAR("梨") {
            @Override
            public String price() {
                return "我是梨的价格";
            }
        },
        APPLE("苹果") {
            @Override
            public String price() {
                return "我是苹果的价格";
            }
        },
        PEACH("桃") {
            @Override
            public String price() {
                return "我是桃的价格";
            }
        };
    
        TypeEnum(String name) {
            this.name = name;
        }
    
        private String name;
    
        public String getName() {
            return name;
        }
    
        public abstract String price();
    
    
        public static String getPrice(String name) {
            for (TypeEnum type : values()) {
                if (type.getName().equals(name)) {
                    return type.price();
                }
            }
            return DEFEND.price();
        }
    }
    

    三、工厂类
    扩展需要实现接口并添加到初始化工厂里。

    public class FruitFactory {
    
        private static Map<String, IFruit> fruitMap = new HashMap<>();
    
        static {
            fruitMap.put("梨", new Pear());
            fruitMap.put("苹果", new Apple());
            fruitMap.put("桃", new Peach());
        }
    
        public static IFruit getType(String fruit) {
            return fruitMap.get(fruit);
        }
    }
    

    这块只罗列苹果类

    public class Apple implements IFruit {
        @Override
        public String price() {
            return "我是苹果价格";
        }
    }
    
    展开全文
  • 记一次多重if判断优化

    万次阅读 2020-01-22 11:37:41
    假如主题名称改了,那你得改32个(当然主题名不可能随意更改)总之这样不利于维护,而且看起来很别扭 在此之前我看过一些关于if优化的博客,大概也就是用策略模式加工厂模式代替 当我看到我对接的kafka的消息中是...

    有时候写代码,你会发现越写越有劲,觉得越有趣,时间在不知不觉中流逝

    先看一下需求场景

    现在开始发挥你们的思路,如果要你们对接,你们会怎么做,写在一个方法里然后判断msgType的类型,然后做相应的事情? 那可就完了,这么多个类型你要挨个判断不说,业务逻辑都写在了一个方法里,你不觉得这样耦合太紧了吗?你当然可以在订阅主题的方法里只写判断然后调用相应的方法,但是这么做。。总有点不好吧,如果你觉得没事,那就没事,当然你可能还会说把多个方法订阅这一个主题,但是注意。在kafka中同一用户组不能订阅同一主题中的同一分区,那你会说弄多个分区不就好了么?恩。。这样问题更大,建议去系统的学习下kafka,那你会觉得那我每个方法订阅的不在同一用户组不就行了?是可以,但是你不觉得弄这么多方法订阅同一主题很别扭?假如主题名称改了,那你得改32个(当然主题名不可能随意更改)总之这样不利于维护,而且看起来很别扭

    在此之前我看过一些关于if优化的博客,大概也就是用策略模式加工厂模式代替

    当我看到我对接的kafka的消息中是通过msgType来判断的时候我就想到了,但是。。这么做弊端更大。看过的应该知道,对于每个情况都得创建一个类来实现一个特定的接口,,,那么我这里有32种情况,就得创建32个类。。这不疯了么

    当然聪明的我肯定不会这么干,那我会怎么做的呢?
    其实和上面那个策略模式类似或者说就是,只是我把“类”改成了“方法”
    你定义32个类来做,肯定疯了,但是32个方法不会呀。。所以我先写枚举,把每种情况都一一列出来

    在这里插入图片描述

    这里对应的就是那32种情况

    然后定义一个注解

    在这里插入图片描述

    这个注解实际上是用来标注,即我们扫描的时候方便一点,不然你怎么扫描,你怎么知道哪个类中的哪个方法是我们需要调用的。

    当然还有一个注解,是放在方法上的

    在这里插入图片描述

    里面有个值,就是我们刚刚定义的那个枚举类型,

    整体思路是这样,通过扫描有DeliveryKafkaConsumer该注解的类,然后再扫描有该类中有DeliveryKafkaConsumerMethod注解的方法,然后拿到DeliveryKafkaConsumerMethod注解的值,就知道当前这个方法是对应的哪种情况

    先来看下怎么使用

    创建一个类加上DeliveryKafkaConsumer注解

    在这里插入图片描述

    然后定义一个方法加上DeliveryKafkaConsumerMethod注解并指定枚举类型说明你要干什么
    在这里插入图片描述

    那么问题来了,我该怎么去调用这个方法,

    其实很简单具体实现

    @Component
    @Getter
    public class DeliveryEventConsumerParsing implements ApplicationContextAware {
    
        private final Map<String, Map<Object, Method>> map = Maps.newConcurrentMap();
    
        private static final ImmutableMap.Builder<String, String> BUILDER = new ImmutableMap.Builder<>();
    
        public static final ImmutableMap<String, String> INFO_MAP;
    
        static {
            MessageDeliveryEventConsumerEnum[] values = MessageDeliveryEventConsumerEnum.values();
            for (MessageDeliveryEventConsumerEnum message : values) {
                BUILDER.put(message.getId(), message.getName());
            }
            INFO_MAP = BUILDER.build();
        }
    
        private ApplicationContext applicationContext;
    
        @Override
        public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
            this.applicationContext = applicationContext;
            parsing();
        }
    
        private void parsing() {
            Map<String, Object> beanMap = applicationContext.getBeansWithAnnotation(DeliveryKafkaConsumer.class);
            Set<Map.Entry<String, Object>> entries = beanMap.entrySet();
            for (Map.Entry<String, Object> entry : entries) {
                Object obj = entry.getValue();
                scannerConsumerMethod(obj);
            }
        }
    
        private void scannerConsumerMethod(Object obj) {
            Class<?> clazz = obj.getClass();
            Method[] methods = clazz.getDeclaredMethods();
            for (Method method : methods) {
                addConsumerMethod(obj, method);
            }
    
        }
    
        private void addConsumerMethod(Object obj, Method method) {
            method.setAccessible(true);
            if (method.isAnnotationPresent(DeliveryKafkaConsumerMethod.class)) {
                DeliveryKafkaConsumerMethod kafka = method.getAnnotation(DeliveryKafkaConsumerMethod.class);
                Map<Object, Method> objMap = Maps.newHashMap();
                objMap.put(obj, method);
                map.put(kafka.value().getId(), objMap);
            }
        }
    }
    
    

    具体调用的方法,这个方法要订阅这个主题,记得要把DeliveryEventConsumerParsing这个类注入进来,因为我们的具体要调用的方法保存在这个类
    在这里插入图片描述

    这个订阅主题的方法,你们可以根据自己的需求的实现,我这里的匹配了一下方法的参数,如果目标方法的参数 我有或者我能从spring中拿到,那我就给他注入进去

    在这里插入图片描述

    自己灵活实现吧,

    注意:这里还有个注意的点 如果你当前类加了 @DeliveryKafkaConsumer这个注解和类中的方法刚好也加了 @DeliveryKafkaConsumerMethod这个注解,那么这时候该类就不能被动态代理,比如定时任务之类的 因为在spring boot中默认使用cglib的动态代理方式,cglib是通过继承重写方法实现的,如果你这个类被代理了,那么他就会重写你的方法,但是导致的问题就是你这个方法上的注解就丢了,扫描不到了

    如果你想在同一个类即使用@DeliveryKafkaConsumer和@DeliveryKafkaConsumerMethod注解,又想被动态代理,这里以定时任务为例

    在这里插入图片描述
    我这里是更新老师的信息,但是有个问题,先要去查询别的接口,并且这个接口要Token才能访问,如果我每次调用这个方法的时候都去重新获取Token 的话,显然是不合理的,
    我看了一下,接口返回的Token有效期为12个小时,那就好办了,我维护一个定时任务,定时来更新Token

    在这里插入图片描述

    在这里插入图片描述

    之前说过,不能写在同一类,但是我有想在一个类中维护,所以定义一个内部类就好了

    其实我之前尝试过很多解决方案,都可以解决,但是我还是觉得不太好,所以最后才想到这个内部类的写法

    这样的话就很方便我们写我们自己的业务逻辑了

    如果我们想监听新增老师的 方法
    只需和下面一样就行

    在这里插入图片描述

    这样写的主要目的就是把业务逻辑分开,有利于自己维护

    如有不对,欢迎指正

    展开全文
  • if ("轿车".equals(carType)) { System.out.println("轿车"); } else if ("卡车".equals(carType)) { System.out.println("卡车"); } else if ("suv".equals(carType)) { System.out.println("SUV"); } //车...
  • 多重if结构

    千次阅读 2012-05-18 12:30:06
    package java基础知识; ... * @param 学生的考试成绩都要评优,良,中,差,这样的分级评定在处理需要用多重if结构 * 语法: * if (条件){ * 语句.. * }else if{ * 语句.. * } els
  • C++中多重if和else if组合

    千次阅读 2019-08-08 14:11:40
    C++中多重if和else if组合 if/else if语句是一对判断组合;多个顺序if是平行的运行判断的。对于单个if();else if(); else if()…如果第一个if未满足条件,则继续依次看接下来的else if是否满足条件,执行即可。 对于...
  • 多重if判断

    千次阅读 2013-01-14 15:22:33
    多重if判断 作用:对一个条件进行多重判断 语法:if(表达式1) { 语句块1; }  else if(表达式2) { 语句块2; } else if(表达式3) { 语句块3; } …….. ……... ……… else { 语句块n; } ...
  • Java if-else 多重嵌套的优化

    千次阅读 2020-01-03 21:15:26
    文章目录1. if-else 多重嵌套的问题2. 解决方案2.1 使用 Map 缓存2.2 switch 简化条件 1. if-else 多重嵌套的问题 2. 解决方案 2.1 使用 Map 缓存 2.2 switch 简化条件
  • 多重if结构   例: public class ScoreAssess { public static void main(String[] args) { /* 成绩大于等于90分,输出“优” 成绩大于等于80分且小于90分,输出“良” 成绩大于等于60分小于80分...
  • Java条件语句之多重 if

    2015-02-06 16:58:02
    Java条件语句之多重 if 多重 if 语句,在条件 1 不满足的情况下,才会进行条件 2 的判断;当前面的条件均不成立时,才会执行 else 块内的代码。例如,如果考试成绩大于 90 分,则奖励一个 IPHONE 5S ,如果...
  • 多重if和嵌套if 01使用格式 001多重if选择的情况是如果条件1选择a条件2选b...... 002嵌套if是在条件a的情况选择1在条件1的情况下在选择(1).... switch 01switch的运用和多重if差不多,但switch只能适合byte、...
  • Java中的条件语句(if、if...else、多重if、嵌套if)详解
  • python 多重if

    千次阅读 2014-12-03 14:14:18
    if [条件1]: [命令1] elif [条件2]: [命令2] .... elif [条件n]: [命令n]
  • php优化if多重嵌套语句

    千次阅读 2017-08-03 11:39:44
    在做公司erp系统的过程中,遇到了一个需求...而本人在编写时由于没想太多大部分用的都是if判断语句来筛选。 最终形成多个if语句嵌套。 if (!isset($factor_divide)) { if($switch_state=='1')
  • Nginx的多重if判断

    千次阅读 2019-05-16 18:12:24
    Nginx中不支持嵌套的if判断,所以使用变量的方式进验证,网上有很多关于这种的方式! server { listen 521; server_name default_server; set $notlogin 0; # 拦截指定页面,~* 是不区分大小写,~ 区分大...
  • 多重if-else语句

    千次阅读 2019-04-15 17:28:58
    C语言自学之多重if-else语句 Dome :  某游戏对不同等级的积分的玩家赋予不同的荣誉称号,其对应关系如下:  积分>=10000分为钻石玩家  积分>=5000并且<10000为白金玩家  积分>=1000并且<5000...
  • C#中多重IF和嵌套IF

    千次阅读 2007-11-05 18:11:00
    判断语句在软件开发过程中是经常见到的,它主要用来对我们需要做出选择...而在使用判断的过程中,我们感到比较困难的就是多重IF和嵌套IF的使用了,现在我就给大家分析一下。1. 多重IF结构如果IF条件需要分成多种情况时
  • 多重if-else的精简方式

    千次阅读 2018-11-16 20:49:34
    实际逻辑情况:当需要多重if-else时,我们通常会面对比较复杂的代码 例如: var custAtten = ''; if(str=='1'){ custAtten='&lt;span class="cust-xxx"&gt;黑&lt;/span&gt;'; }else ...
  • 多重if选择结构

    千次阅读 2018-03-27 20:12:54
     if (money>500) {  System.out.println("买凯迪拉克");  }else if (money>100){  System.out.println("买帕萨特");  }else if (money>50) {  System.out.println("买伊兰特");  }else if (money>10) {  ...
  • 多重if条件语句的使用

    千次阅读 2018-04-20 12:09:50
    题目描述 多重if条件语句的使用。package test3_4; import java.util.Scanner; public class Test3_4 { public static void main(String[] args) { Scanner in=new Scanner(System.in); System.out.println("...
  • Java 条件语句之多重 if

    千次阅读 2017-01-11 17:05:33
    多重 if 语句 ,在条件 1 不满足的情况下,才会进行条件2 的判断;当前面的条件不成立时,才会执行 else 块内的代码。例如:如果成绩大于 90 分,则奖励一个 果7,如果成绩介于 80 至 90 分之间,则奖励一个红米,...
  • oracle sql 多重if else if 判断

    千次阅读 2014-03-28 14:25:00
     DECODE(P.SEX, 0, '先生', 1, '女士', 2,'人妖') sql中最实用的if else if else if ,这个平常我常用,拿出来给各位提个醒 转载于:https://my.oschina.net/u/576942/blog/213781

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 127,649
精华内容 51,059
关键字:

多重if如何优化