ifelse是我们写代码时最常使用的关键字之一,但有时太多的ifelse会让我们头疼。图片来自Pexels。例如,下面的伪代码:Isitverybroken?虽然是伪代码,看起来很夸张,但在现实中,当我们无数次回顾别人的代码时,也会发现类似的场景。那么本文就来详细说说吧。有什么办法可以避免写那么多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";}we先定义一个Map数组,存放相关判断信息:MaptypeMap=newHashMap<>();typeMap.put(1,"name");typeMap.put(2,"id");typeMap.put(3,"手机");之前的判断语句可以换成下面一行代码:type=typeMap.get(t);3.使用三元运算符三元运算符也称为三元表达式或三元运算符/表达式,但都表示相同的含义,优化后的代码如下。优化前代码:Integerscore=81;if(score>80){score=100;}else{score=60;}优化后代码:score=score>80?100:60;4.组合项目中的条件表达式一些逻辑判断可以通过组合和归纳变成更简单易懂的逻辑判断代码,如下图。优化前代码:Stringcity="西安";Stringarea="029";Stringprovince="陕西";if("西安".equals(city)){return"西安";}if("029".equals(area)){return"xi'an";}if("陕西".equals(province)){return"xi'an";}优化代码:if("Xi'an".equals(city)||"029".equals(area)||"陕西".equals(省)){return"xi'an";}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){ifthis.typeId=typeId;}}之前的else判断可以换成下面一行代码:typeId=TypeEnum.valueOf("Name").typeId;6、使用Optional从JDK1.8开始引入Optional类,在JDK9:00,改进了Optional类,增加了ifPresentOrElse()方法。我们可以用它来去掉ifelse的判断,如下使用。优化前的代码:Stringstr="java";if(str==null){System.out.println("Null");}else{System.out.println(str);}优化后的代码:Optionalopt=Optional.of("java");opt.ifPresentOrElse(v->System.out.println(v),()->System.out.println("Null"));提示:注意运行version,必须是JDK9+才行。7、梳理优化判断逻辑和第4点类似,我们可以通过分析ifelse的逻辑判断语义,写出更易懂的代码,比如下面的嵌套判断优化。优化前代码://年龄大于18if(age>18){//工资大于5000if(salary>5000){//漂亮吗if(pretty==true){returntrue;}}}returnfalse;优化代码:if(age<18){returnfalse;}if(salary<5000){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;}利用多态性,我们首先定义一个接口,在接口中声明一个publicreturntypeId方法,添加三个子类分别实现三个子类。实现代码如下:为了简单起见,我们这里把类和接口放到一个代码块中。在实际开发中,一个接口和三个类应该分别创建和存储。此时,我们之前的ifelse判断可以改为如下代码:ITypeitype=(IType)Class.forName("com.example."+type).newInstance();IntegertypeId=itype.getType();可能有人会说这样会使代码变得复杂,可谓是“杀鸡用牛刀”的典型例子。这里笔者只是提供了一种实现思路和一些简单版本的代码,让开发者在实际开发中多了一个思路和选择。具体使用需要根据实际情况确定。灵活地从一个实例中推断出其他情况是最好的开发方法。9、switch的选择性使用很多人不了解switch和ifelse的使用场景,但是在两者都可以用的时候,switch还是尽量用吧,因为在constantbranchselection中switch的性能会比if好。否则高。ifelse判断代码:if("add".equals(cmd)){result=n1+n2;}elseif("subtract".equals(cmd)){result=n1-n2;}elseif("multiply".equals(cmd)){result=n1*n2;}elseif("divide".equals(cmd)){result=n1/n2;}elseif("modulo".equals(cmd)){result=n1%n2;}切换代码:switch(cmd){case"add":result=n1+n2;break;case"subtract":result=n1-n2;break;case"multiply":result=n1*n2;break;case"divide":result=n1/n2;break;case"modulo":result=n1%n2;break;}switch代码块可以在Java14中使用,实现代码如下://java14switch(cmd){case"add"->{result=n1+n2;}case"subtract"->{result=n1-n2;}case"multiply"->{result=n1*n2;}case"divide"->{result=n1/n2;}case"modulo"->{result=n1%n2;}}10.综上所述,因果报应善于勤闲,思想上的成功被及时毁掉。编程是一门手艺,更是一种乐趣。哈佛最受欢迎的幸福课程《幸福的方法》写道,“让我们感到快乐和快乐的方法无非就是全心全意地投入到自己身上,付出一点点努力。”去做可以做的工作”!是的,太容易的事情通常不能引起我们的兴趣,而太难的任务会让我们失去信心。只有那些看似困难但稍加努力就能完成的事情,才会给我们带来莫大的幸福。我认为编程也是如此。每个人都能写出通用的方法,但不是每个人都能写出更优雅的代码。本文只是提供一些编写优雅代码的思路,希望能对你有所帮助和启发。参考&致谢:https://www.tuicool.com/wx/2euqQvZhttp://www.blogjava.net/xzclog/archive/2006/10/16/75399.html作者:王磊编辑:陶家龙来源:转载来自微信公众号Java中文社区(ID:javacn666)