ifelse是我们写代码时,使用频率最高的关键词之一,然而有时过多的ifelse会让我们感到脑壳疼。
图片来自Pexels
例如下面这个伪代码:
是不是很崩溃?虽然他是伪代码,并且看起来也很夸张,但在现实中,当我们无数次Review别人代码时,都会发现类似的场景。
那么我们本文就来详细聊聊,有没有什么方法可以让我们避免来写这么多的ifelse呢?
我们本文提供了9种方法来解决掉那些“烦人”的ifelse,一起来看吧。
1、使用return
我们使用return去掉多余的else,实现代码如下。
优化前代码:
if(java.equals(str)){//业务代码......}else{return;}
优化后代码:
if(!java.equals(str)){return;}//业务代码......
这样看起来就会舒服很多,虽然相差只有一行代码,但真正的高手和普通人之间的差距就是从这一行行代码中体现出来的。
“勿以善小而不为,勿以恶小而为之”,“千里之堤,溃于蚁穴”,说的都是同样的道理。
2、使用Map
使用Map数组,把相关的判断信息,定义为元素信息可以直接避免ifelse判断,实现代码如下。
优化前代码:
if(t==1){type=name;}elseif(t==2){type=id;}elseif(t==3){type=mobile;}
我们先定义一个Map数组,把相关判断信息存储起来:
MapInteger,StringtypeMap=newHashMap();typeMap.put(1,name);typeMap.put(2,id);typeMap.put(3,mobile);
之前的判断语句可以使用以下一行代码代替了:
type=typeMap.get(t);
3
使用三元运算符
三元运算符也叫三元表达式或者三目运算符/表达式,不过代表的都是一个意思,优化代码如下。
优化前代码:
Integerscore=81;if(score80){score=;}else{score=60;}
优化后代码:
score=score80?:60;
4、合并条件表达式
在项目中有些逻辑判断是可以通过梳理和归纳,变更为更简单易懂的逻辑判断代码,如下所示。
优化前代码:
Stringcity=西安;Stringarea=;Stringprovince=陕西;if(西安.equals(city)){returnxian;}if(.equals(area)){returnxian;}if(陕西.equals(province)){returnxian;}
优化后代码:
if(西安.equals(city)
.equals(area)
陕西.equals(province)){returnxian;}
5、使用枚举
JDK1.5中引入了新的类型——枚举(enum),我们使用它可以完成很多功能,例如下面这个。
优化前代码:
IntegertypeId=0;Stringtype=Name;if(Name.equals(type)){typeId=1;}elseif(Age.equals(type)){typeId=2;}elseif(Address.equals(type)){typeId=3;}
优化时,我们先来定义一个枚举:
publicenumTypeEnum{Name(1),Age(2),Address(3);publicIntegertypeId;TypeEnum(IntegertypeId){this.typeId=typeId;}}
之前的ifelse判断就可以被如下一行代码所替代了:
typeId=TypeEnum.valueOf(Name).typeId;
6、使用Optional
从JDK1.8开始引入Optional类,在JDK9时对Optional类进行了改进,增加了ifPresentOrElse()方法,我们可以借助它,来消除ifelse的判断,使用如下。
优化前代码:
Stringstr=java;if(str==null){System.out.println(Null);}else{System.out.println(str);}
优化后代码:
OptionalStringopt=Optional.of(java);opt.ifPresentOrElse(v-System.out.println(v),()-System.out.println(Null));
小贴士:注意运行版本,必须是JDK9+才行。
7、梳理优化判断逻辑
和第4点比较类似,我们可以通过分析ifelse的逻辑判断语义,写出更加易懂的代码,例如以下这个嵌套判断的优化。
优化前代码:
//年龄大于18if(age18){//工资大于if(salary){//是否漂亮if(pretty==true){returntrue;}}}returnfalse;
优化后代码:
if(age18){returnfalse;}if(salary){returnfalse;}returnpretty;
我们需要尽量把表达式中的包含关系改为平行关系,这样代码可读性更高,逻辑更清晰。
8、使用多态
继承、封装和多态是OOP(面向对象编程)的重要思想,本文我们使用多态的思想,提供一种去除ifelse方法。
优化前代码:
IntegertypeId=0;Stringtype=Name;if(Name.equals(type)){typeId=1;}elseif(Age.equals(type)){typeId=2;}elseif(Address.equals(type)){typeId=3;}
使用多态,我们先定义一个接口,在接口中声明一个公共返回typeId的方法,在添加三个子类分别实现这三个子类。
实现代码如下:
publicinterfaceIType{publicIntegergetType();}publicclassNameimplementsIType{
OverridepublicIntegergetType(){return1;}}publicclassAgeimplementsIType{OverridepublicIntegergetType(){return2;}}publicclassAddressimplementsIType{OverridepublicIntegergetType(){return3;}}注意:为了简便我们这里把类和接口放到了一个代码块中,在实际开发中应该分别创建一个接口和三个类分别存储。
此时,我们之前的ifelse判断就可以改为如下代码:
ITypeitype=(IType)Class.forName(