做者 |老王
滥觞 |公家号Java中文社区
if else 是我们写代码时,利用频次最下的枢纽词之一,但是偶然过量的 if else 会让我们感应脑袋痛,比方上面那个真代码:
是否是很奔溃?固然他是真代码,而且看起去也很夸大,但正在理想中,当我们无数次 review 他人代码时,城市发明相似的场景,那末我们本文便去具体聊聊,有无甚么办法可让我们制止去写那么多的 if else 呢?
我们本文供给了 9 种办法去处理失落那些“烦人”的 if else,一同去看吧。1.利用 return
我们利用 return 来失落过剩的 else,完成代码以下。劣化前代码:if (str.equals("java")) {
// 营业代码 ! true;
} else {
return ;
}劣化后世码:if (str.equals("java")) {
return ;
}
return false;如许看起去便会舒适许多,固然相好只要一止代码,但真实的妙手战一般人之间的差异便是从那一止止代码中表现出去的。「勿以擅小而没有为,勿以恶小而为之」「千里之堤,溃于蚁穴」,道的皆是一样的原理。2.利用 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);3.利用三元运算符
三元运算符也叫三元表达式大概三目运算符/表达式,不外代表的皆是一个意义,劣化代码以下。劣化前代码:Integer score = 81;
if (score > 80) {
score = 100;
} else {
score = 60;
}劣化后世码:score = score > 80 ? 100 : 60;4.兼并前提表达式
正在项目中有些逻辑判定是能够经由过程梳理战归结,变动为更简朴易懂的逻辑判定代码,以下所示。
劣化前代码:
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";
}5.利用列举
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;6.利用 Optional
从 JDK 1.8 开端引进 Optional 类,正在 JDK 9 时对 Optional 类停止了改良,增长了 ifPresentOrElse() 办法,我们能够借助它,去消弭 if else 的判定,利用以下。劣化前代码:String str = "java";
if (str == null) {
System.out.println("Null");
} else {
System.out.println(str);
}劣化后世码:Optional<String> opt = Optional.of("java");
opt.ifPresentOrElse(v ->
System.out.println(v), () -> System.out.println("Null"));小揭士:留意运转版本,必需是 JDK 9+ 才止。 7.梳理劣化判定逻辑
战第 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;我们需求只管把表达式中的包罗干系改成仄止干系,如许代码可读性更下,逻辑更明晰。8.利用多态
担当、启拆战多态是 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();
有人能够会道,如许反而让代码愈加庞大了,此可谓“杀鸡焉用宰牛刀”的典范规范了。那里做者只是供给一种完成思绪战供给了一些浅易版的代码,以供开辟者正在实践开辟中,多一种思绪战挑选,详细用不消需求按照实践状况去定了。灵敏变通,触类旁通,才是开辟的上乘心法。
9.挑选性的利用 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;
}
}总结
业粗于勤荒于嬉,止成于思誉于随。编程是一门技术,更是一种兴趣,哈佛最受欢送的幸运课《幸运的办法》一书中写到「让我们能感应高兴战幸运的办法,不过是满身心的投进到本人略微勤奋一下就可以完成的事情中来!」是啊,太简朴的工作凡是没法变更起我们的爱好,而太易的事情又会让我们损失自信心,只要那些看似很易但略微勤奋一面就可以完成的工作,才会给我们带去宏大的高兴。我念编程也是一样,一般的办法每一个人城市写,但是文雅一面的代码没有是一切人皆能写得出去,而本文恰好是供给了写出文雅代码的一些思绪,期望能够协助战启示到您。最初的话
本创不容易,假如以为本文对您有效,请顺手面击一个「正在看」,那是对做者最年夜的撑持取尊敬,感谢您。
参考 & 道谢https://www.tuicool.com/wx/2euqQvZhttp://www.blogjava.net/xzclog/archive/2006/10/16/75399.html
· 远 · 期 · 祸 · 利 ·
1元试听 | Java架构师系统课精髓内乱容:完成Kafka进门到超神!
1元试听 | Java齐栈系统课精髓内乱容:完全弄懂笼统的Java编程思惟!
1元试听 | 年夜前端系统课精髓内乱容:快速理浑年夜前端常识头绪!
1元体验 | 四天带您整根底进门Java/前端/Python!
1元祸利 | 带您写一份下量量的小法式版简历,吊挨口试民!!
END
● 假设有人把付出宝存储效劳器炸了
● 暴光一波955没有减班的公司名单:955.WLB
● 假设计较机是中国人创造的,那代码该当那么写
● 神操纵!好国法式员把事情中包给中国法式员,上班摸鱼吸猫年进20万美圆
|