责编 | 郭芮
if else 是我们写代码时,利用频率最高的关键词之一,然而有时过多的 if else 会让我们感到脑壳疼,例如下面这个伪代码:
是不是很奔溃?虽然他是伪代码,并且看起来也很夸年夜,但在现实中,当我们无数次 review 别人代码时,都会创造类似的场景,那么我们本文就来详细聊聊,有没有什么方法可以让我们避免来写这么多的 if else 呢?

我们本文供应了 9 种方法来办理掉那些“烦人”的 if else,一起来看吧。
利用 return
我们利用 return 去掉多余的 else,实当代码如下。
优化前代码:
if (\"大众java\"大众.equals(str)) {
// 业务代码......
} else {
return;
}
优化后代码:
if (!\公众java\"大众.equals(str)) {
return;
}
// 业务代码......
这样看起来就会舒畅很多,虽然相差只有一行代码,但真正的高手和普通人之间的差距便是从这一行行代码中表示出来的。
「勿以善小而不为,勿以恶小而为之」「千里之堤,溃于蚁穴」,说的都是同样的道理。
利用 Map
利用 Map 数组,把干系的判断信息,定义为元素信息可以直接避免 if else 判断,实当代码如下。
优化前代码:
if (t == 1) {
type = \公众name\"大众;
} else if (t == 2) {
type = \"大众id\"大众;
} else if (t == 3) {
type = \"大众mobile\"大众;
}
我们先定义一个 Map 数组,把干系判断信息存储起来:
Map<Integer, String> typeMap = new HashMap<>;
typeMap.put(1, \"大众name\"大众);
typeMap.put(2, \公众id\"大众);
typeMap.put(3, \"大众mobile\公众);
之前的判断语句可以利用以下一行代码代替了:
type = typeMap.get(ty);
利用三元运算符
三元运算符也叫三元表达式或者三目运算符/表达式,不过代表的都是一个意思,优化代码如下。
优化前代码:
Integer score = 81;
if (score > 80) {
score = 100;
} else {
score = 60;
}
优化后代码:
score = score > 80 ? 100 : 60;
合并条件表达式
在项目中有些逻辑判断是可以通过梳理和归纳,变更为更大略易懂的逻辑判断代码,如下所示。
优化前代码:
String city = \公众西安\"大众;
String area = \公众029\公众;
String province = \"大众陕西\"大众;
if (\"大众西安\公众.equals(city)) {
return \"大众xi'an\"大众;
}
if (\"大众029\"大众.equals(area)) {
return \"大众xi'an\"大众;
}
if (\"大众陕西\"大众.equals(province)){
return \"大众xi'an\"大众;
}
优化后代码:
if (\"大众西安\公众.equals(city) || \"大众029\公众.equals(area) || \"大众陕西\"大众.equals(province)){
return \公众xi'an\公众;
}
利用列举
JDK 1.5 中引入了新的类型——列举(enum),我们利用它可以完成很多功能,例如下面这个。
优化前代码:
Integer typeId = 0;
String type = \"大众Name\公众;
if (\公众Name\"大众.equals(type)) {
typeId = 1;
} else if (\公众Age\"大众.equals(type)) {
typeId = 2;
} else if (\"大众Address\公众.equals(type)) {
typeId = 3;
}
优化时,我们先来定义一个列举:
public enum TypeEnum {
Name(1), Age(2), Address(3);
public Integer typeId;
TypeEnum(Integer typeId) {
this.typeId = typeId;
}
}
之前的 if else 判断就可以被如下一行代码所替代了:
typeId = TypeEnum.valueOf(\"大众Name\"大众).typeId;
利用 Optional
从 JDK 1.8 开始引入 Optional 类,在 JDK 9 时对 Optional 类进行了改进,增加了 ifPresentOrElse 方法,我们可以借助它,来肃清 if else 的判断,利用如下。
优化前代码:
String str = \公众java\"大众;
if (str == ) {
System.out.println(\"大众\"大众);
} else {
System.out.println(str);
}
优化后代码:
Optional<String> opt = Optional.of(\"大众java\"大众);
opt.ifPresentOrElse(v ->
System.out.println(v), -> System.out.println(\公众\公众));
小贴士:把稳运行版本,必须是 JDK 9+ 才行。
梳理优化判断逻辑
和第 4 点比较类似,我们可以通过剖析 if else 的逻辑判断语义,写出更加易懂的代码,例如以下这个嵌套判断的优化。
优化前代码:
// 年事大于 18
if (age > 18) {
// 人为大于 5000
if (salary > 5000) {
// 是否俊秀
if (pretty == true) {
return true;
}
}
}
return false;
优化后代码:
if (age < 18) {
return false;
}
if (salary < 5000) {
return false;
}
return pretty == true;
我们须要只管即便把表达式中的包含关系改为平行关系,这样代码可读性更高,逻辑更清晰。
利用多态
继续、封装和多态是 OOP(面向工具编程)的主要思想,本文我们利用多态的思想,供应一种去除 if else 方法。
优化前代码:
Integer typeId = 0;
String type = \"大众Name\"大众;
if (\公众Name\公众.equals(type)) {
typeId = 1;
} else if (\公众Age\"大众.equals(type)) {
typeId = 2;
} else if (\公众Address\"大众.equals(type)) {
typeId = 3;
}
利用多态,我们先定义一个接口,在接口中声明一个公共返回 typeId 的方法,在添加三个子类分别实现这三个子类,实当代码如下:
public interface IType {
public Integer getType;
}
public class Name implements IType {
@Override
public Integer getType {
return 1;
}
}
public class Age implements IType {
@Override
public Integer getType {
return 2;
}
}
public class Address implements IType {
@Override
public Integer getType {
return 3;
}
}
把稳:为了简便我们这里把类和接口放到了一个代码块中,在实际开拓中该当分别创建一个接口和三个类分别存储。
此时,我们之前的 if else 判断就可以改为如下代码:
IType itype = (IType) Class.forName(\"大众com.example.\公众 + type).newInstance;
Integer typeId = itype.getType;
有人可能会说,这样反而让代码更加繁芜了,此可谓“杀鸡焉用宰牛刀”的范例范例了。这里作者只是供应一种实现思路和供应了一些大略单纯版的代码,以供开拓者在实际开拓中,多一种思路和选择,详细用不用须要根据实际情形来定了。灵巧变通,举一反三,才是开拓的上乘心法。
选择性的利用 switch
很多人都搞不懂 switch 和 if else 的利用场景,但在两者都能利用的情形下,可以只管即便利用 switch,由于 switch 在常量分支选择时,switch 性能会比 if else 高。
if else 判断代码:
if (cmd.equals(\"大众add\"大众)) {
result = n1 + n2;
} else if (cmd.equals(\公众subtract\公众)) {
result = n1 - n2;
} else if (cmd.equals(\公众multiply\"大众)) {
result = n1 n2;
} else if (cmd.equals(\"大众divide\公众)) {
result = n1 / n2;
} else if (cmd.equals(\"大众modulo\"大众)) {
result = n1 % n2;
}
switch 代码:
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;
}
在 Java 14 可利用 switch 代码块,实当代码如下:
// java 14
switch (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;
}
}
总结
业精于勤荒于嬉,行成于思毁于随。编程是一门手艺,更是一种乐趣,哈佛最受欢迎的幸福课《幸福的方法》一书中写到「让我们能感到快乐和幸福的方法,无非是全身心的投入到自己轻微努力一下就能完成的事情中去!
」是啊,太大略的事情常日无法调动起我们的兴趣,而太难的事情又会让我们损失约念,只有那些看似很难但轻微努力一点就能完成的事情,才会给我们带来巨大的快乐。
我想编程也是一样,普通的方 法每个人都会写,然而优雅一点的代码不是所有人都能写得出来,而本文正好是供应了写出优雅代码的一些思路,希望可以帮助和启示到你。
声明:本文为作者投稿,版权归其所有。
今日福利
遇见大咖
由 CSDN 全新专为技能人打造的高端对话栏目《大咖来了》来啦!
CSDN 创始人&董事长、极客帮创投创始合资人蒋涛携手京东集团技能副总裁、IEEE Fellow、京东人工智能研究院常务副院长、深度学习及语音和措辞实验室卖力人何晓冬,来也科技 CTO 胡一川,共话中国 AI 运用元年来了,开拓者及企业的路径及发展方向!