if else 是咱们写代码时,运用频率最高的关键词之一,但是有时过多的 if else 会让咱们感到脑壳疼,例如下面这个伪代码:

9个小技巧让你的 if else看起来更优雅

是不是很奔溃?虽然他是伪代码,而且看起来也很夸大,但在实践W 4 – ! i X A中,当咱们无数次 revT ` 8 o :iew 他人代码时,都会发现类似的场景,那么咱们本文就来详细聊聊,有没有什么办法能够让咱们避免来写这么多的 if else 呢?

咱们本文供给了 9 种办法来处理掉那些“烦人”的 if else,一起来看吧。

1.运用 return

咱们运用 return去掉剩o O ( ] / ] Q R余的 else,完结代码如下。

优化前代码:

if ("java".equals(str)e + f T 3 5 g) {
// 事务代码......
} else {
return;
}

优化后代码:

if (!"java".equals(str)) {
return` | . H z C @ n;
}
// 事务代码......

这样看起来就会舒畅很多,虽然相差只有一行代码,但真实的s H c . T *高手和普通人之间的差距就是从这一行行代码u : f中体现出来的。

「勿以善小而不为,勿以恶小而为之」「千里之堤,溃于蚁穴」,说的都是相同的道理。

2.运用 Map

运用 Map 数组,把相关的P L q r $ g H 1判别信息,界说为元素信息能够直接避免 if elA F s . : tse 判别,完结代码如下。

优化前代码:

if (t == 1) {
type = "name";
} else if (t == 2) {
type = "id";
} else if (t == 3) {
type = "mobile";
}

咱们先界说一个 Map 数组,把相关判别信息存储起来:

Map<z x ^;Integer, String> typeMap =) M L } x new& c 1 D HashMap<>();
typeMap.put(1, "name");
typZ U x D aeMa= 6 V F 9 V Q `p.put(2, "id");
typeMap.put(3, "mobile");

之前的判, w z V @ &别句子能够运用以下一行代码代替了:

type = typeMap.get(k B g @ / z 0 t);

3.运用三元运算符

三元运算符也叫三元表达式或许三目运算符/表达式,不过代表的都是一个意思,优化代码如下。

优化前代码:

Integer score = 81;
if (score > 80) {
score = 15 d 2 K * ] e00;
} else {
score = 60;
}

优化后代码:

score = score > 80 ? 100 : 60;

4.合并条件表达式

在项目中有些逻辑判别是能够经过整理和归纳,变更为更简略易懂的逻辑判别代码,如下所示。

优化前代码:

String ci$ 1 uty =X S - K x ~ u O q "西安";
String area = "029";
String province = "陕西";
if ("西安".equals(city)) {
return "xi'an";
}
if ("029".equals(area)) {
return "xi'an";
}
if ("陕西".equals] n ? : Z m &(province)){
return "xi'ana 8 r : E r ^ Q";
}

优化后代码:

if ("C @ C U 8 D V v西% W ~安".equals(city) || "029".equals(area) || "陕西".eq} * & Huals(province)){
return "xi'an";
}

5.运用枚举

JDK 1.5 中引进了新的类型——枚举(enum),咱们运用它能够完结很多功能,例如下面这个– U k – u

优化前代码:

Integer typeId = 0;
String type = "Name";
if ("Name".equals(type)) {
typeId = 1;
} else if ("Age".equals(type)) {
typeId = 2;
} else if ("Address".e@ 5 S s J w oquals(typeN - 1 , a)) {
typeId = 3;
}

优化时,咱们先来界说一个枚举:

public enum TypeEnum {
Name(1), Age(2), Addre~ & & N kss(3);
public Integer typeId;
T/ z P a 9 , [ypeEnum(IntegeH _ W U y X ! 0r typeId) {
this.typeId = typeId;
}
}

之前的 if else 判别就能够被如下一$ o 9 e @ &行代码所替代了:

typeId = TypeEnum.valueOf(x T % I Y"Name").typeId;

6.运用 Optional

从 JDK 1.8 开端引进 Optional 类,在 JDK 9 时对 OptZ ; s . } [ional 类进行了改进,增加了 ifPresentOrElse() 办O H N K . L g g 法,咱们能够借助它,来消除 if else 的判别,e O k n K o T U F运用如下。

优化前代码:

String^ a p Z a u L str = "java";
if (str == null) {
System.out.println("Null");
} elsH a 6 % ] h Be {
System.out.println(str);
}

优化后代码:

Optional<String> opt = Optional.o.  i 3f("jaD e k Q v zva");
opt.ifPresentOrElse(v ->9 Q k;
System.out.printlY d J J $ 0n(v), () -> System.out.println("Null"));

小贴士:注意运转版本,必须是 JDK 9+ 才行。

7.整理优化判别逻辑

和第 4 点比较类似,咱们能够经过剖析 if^ Q x J 5 N K U else 的逻辑判别语义,写出愈加易懂的代码,例如以下这个嵌套判别的优化。

优化前代码:

// 年纪大于 18
if (ai  T 0 v I [ge > 18) {
// 薪酬大于 5000
if (salary > 5000) {
// 是否美丽
if (pretty == true) {
return true;
}
}
}
retu~ _ n ? 1 p 1rn false;

优化后代码:

if (Q f P 9 ) Rage < 18) {
return false;
}
if (salary < 5000) {
return false;
}
return pretty == true;

咱们需要尽量把表达式中的包含联系改为平行联系,这样代码可读性更高,逻辑更清晰。

8.运用多态

继承、封装和多态是 OOP(面向对象编程)的重要思q @ 7 + ^ W V 6 n维,本文咱们运用多态的思维,供给一种去除 if else 办法。

优化前代码:U 9 z y ^ %

Inte( Y ^ # C ` Rger typeId = 0;
String type = "Name";
if ("Name".equal H ( t B E }  ss(type)) {
typeId =K & @ K N 1;D u , ! o [ @ i f
} else if ("Age".equals(type)) {
typeId = 2;
} else if ("Address".equals(type)) {
typeId = 3;
}

运用多态,咱们先界说一个接口,在接口中声明一个公共返回Q & y ! typeId的办法,在添加三个子x ) ? c类别离完结这三个子类,完结代码如下:

public interface IType {
public Integer getType();
}
public class Name impE * 4lements IType {
@q h & ^ (Override
public Integer getType() {
return 1;
}
}
public class Age implements IType {
@Override
public Integer getType() {
return 2;
}
}
public class Address implements ITyV E ?pe {
@Override
pubv } GlicB k ? Integer getType() {
retuy N P } 8 D Xrn 3;
}
}

注意:为了简洁咱们这儿把类和接口放到了一个代码块中,n a X F在实践开发中应该别离创立w e c A一个接口和三个类别离存储。

此时,咱们之前的 if elsW & p 7 V 2 ; Ne 判别就能够改为如下代码:

IType itype = (IType) Class.forName("com.example." + type).F @ $ ynewInstance();
Integer typeId = itype.getType();

有人或许会说,这样反而让代码 ` ! Q 6 7 R愈加复. { #杂了,此可谓“杀鸡焉用宰牛刀”的典型范例4 | ,了。这儿作者仅仅供给一种完结思路和供给了r ( P Z 3一些简易版的代码,以供开发者在实践开发中,多一种思路和选择,详细用不用需要依据实践情况来定了。灵活变通,触类旁通,才是开发的上乘心法

9.选择性的运用 switch

很多人都搞不懂 switch 和 if else 的运用场景,但在两者都能运用的情况下,能够尽量运用 switch,由于 switch 在常量分支选择时,switch 性能会比 if else 高。

if else 判别代码:

if ("add".equals(cmd)) {
result = n1 + n2;
} else if ("subtract".equals(cmd)) {
result = n1L I Z & K B l - n2;
} else if ("multiply".equals(cmd)) {
result =9 ! R / q 9 # D ] n1 * n2;
} else if ("divide".equals(cmd)) {
result = n1 / n2;
} else if ("modulo".equals(cmd)) {
result = n* O m  # @ e b t1 % n2;
}

switcC 0 lh 代码:

switch (cmd) {* F J # N { Q i c
case "add":
res. ? o 5 lult = n1 + n2;
break;
case "subtract":
result = n1 - n2;
break;
case 2 U = -"multiply":
result = n1 * n2;
break;
case "divide":
result = n1 / n2;
break;
case "modulo":
result = n1 % n2;
break;
}

在 Java 14 可运用 switch 代码块,完结代码如_ | * R 2 Z 下:

// java 14
switch (cmd) {
cv o { 1 gase "add" -> {
resulv { k Y 4 ` ut = n1 + n2;
}
case "subtract" ->Y ^ @ n s .; {
result = n1 - n2 8 w k f 2 !;
}
case "multiply"@ S 2 U - -> {
result = n1 * n2;
}
case "divi7 y z 0de" -&go y . O g Z T W :t; {
resuE 9 = 7lt =; * s | ; n1 / n2;
}
case "modulo" -> {& I t L R O 4 ,
result = n1 % n2;
}
}

总结

业精于勤j X X H `荒于嬉,行成于思毁于随。编程是一门手艺,更是一种趣味,哈佛最受欢迎的美好课《美好的办法》一书中写到「让咱们能感到快乐和美好的办法,无非是全身心的投入到自己G s x F a m略微尽力一下才干完结的作业中去!」是啊,太简略的作业通常无法调动起咱们的兴趣,而太难的作业又会让咱们丧失信心,只有那些看似很难但略微尽力一点就能r ^ . + =完结的作业,才会给咱们带来巨大的快乐。

最终的话

原创不易,假 ! p T ) O如觉得本文对你有用,请随手点击一个「」,这是对作者最大的支撑与尊重,J q ] H 6 a谢谢你。

参考 & 道谢

www.tuicool.com/wx/2euqQvZ

www.blogjava.net/xzclog/t B k k d 8 v yarch…

更多精彩内容,请重视微信大众号「Java中文社群」

9个小技巧让你的 if else看起来更优雅