搜索
您的当前位置:首页正文

Java编程技巧:if-else优化实践总结归纳

来源:爱够旅游网
Java编程技巧:if-else优化实践总结归纳

⽬录

⼀、使⽤策略枚举来优化if-else⼆、使⽤三⽬运算符来优化if-else

1、根据if-else条件来判断赋值的,如:2、利⽤if-else条件来判断调⽤⽅法,如:三、使⽤Stream优化if中判断条件过多情况四、使⽤Map优化if-else五、使⽤枚举优化if-else六、使⽤Optional类优化if-else总结

⼀、使⽤策略枚举来优化if-else

看到⽹上蛮多⼈推荐使⽤策略模式来优化if-else,但我总觉得,搞⼀堆策略类来优化⼤批量if-else,虽然想法很好,但⽆意之中很可能⼜会创造出很多类对象,就显得过于繁重了。若想使⽤策略模式来优化⼤批量if-else,其实有⼀种更好的⽅式,这是策略模式+枚举⽅式的改良,我以前写过这样⼀篇优化⽂章,详细直接点击该⽂了解

⼆、使⽤三⽬运算符来优化if-else

1、根据if-else条件来判断赋值的,如:

String id=\"\";if(flag){ id=\"a\";}else{ id=\"b\";}

利⽤三⽬运算符,可以直接优化成⼀⾏代码:

id=flag?\"a\":\"b\";

2、利⽤if-else条件来判断调⽤⽅法,如:

Set set1=new HashSet<>();Set set2=new HashSet<>();if(flag){

set1.add(id);}else{

set2.add(id);}

利⽤三⽬运算符,可以直接优化成:

Set set1=new HashSet<>();Set set2=new HashSet<>();(flag?set1:set2).add(id);

三、使⽤Stream优化if中判断条件过多情况

Jdk1.8新特性Stream流有三个这样API,anyMatch,allMatch,noneMatch,各⾃的作⽤如下:

anyMatch:判断条件⾥任意⼀个满⾜条件,则返回true;allMatch:判断条件⾥所有都满⾜条件,则返回true;noneMatch:判断条件⾥所有都不满⾜条件,则返回true;它们的使⽤⽅式其实很简单:

List list = Arrays.asList(\"a\//任意⼀个字符串判断不为空则为true

boolean anyMatch = list.stream().anyMatch( s->StringUtils.isEmpty(s));//所有字符串判断都不为空则为true

boolean allMatch = list.stream().allMatch( s->StringUtils.isEmpty(s));

//没有⼀个字符判断为空则为true

boolean noneMatch = list.stream().noneMatch( s->StringUtils.isEmpty(s));

可见,根据以上三种实现⽅式,可以在某种程度上优化if⾥判断条件过多的情况,那么,在哪种场景⾥⽐较合适利⽤其优化呢?

在⽇常实际开发当中,我们可能会看到过这样存在很多判断条件的代码:

if(StringUtils.isEmpty(str1) || StringUtils.isEmpty(str2) || StringUtils.isEmpty(str3) || StringUtils.isEmpty(str4) || StringUtils.isEmpty(str5) || StringUtils.isEmpty(str6) ){ .....}

这时,就可以考虑到,使⽤stream流来优化,优化后的代码如下:

if(Stream.of(str1, str2, str3, str4,str5,str6).anyMatch(s->StringUtils.isEmpty(s))){ ..... }

这样优化后,是不是就⽐那堆if⾥堆积到⼀块的条件更为优雅了?

当然,这只是针对或条件的,若是遇到与条件时,同样可以⽤Stream来优化,例如:

if(StringUtils.isEmpty(str1) && StringUtils.isEmpty(str2) && StringUtils.isEmpty(str3) && StringUtils.isEmpty(str4) && StringUtils.isEmpty(str5) && StringUtils.isEmpty(str6)){ .....}

使⽤Stream优化后:

if(Stream.of(str1, str2, str3, str4,str5,str6).allMatch(s->StringUtils.isEmpty(s))){ .....}

四、使⽤Map优化if-else

优化量⽐较多的⾯向过程的if-else语句,还可以考虑使⽤Map来优化,虽然在⼀定程度上,创建⼀个额外map会占⽤内存,但那丁点内存对于现阶段计算机⽽⾔,可以说不⾜挂齿。下⾯使⽤⼀个案例来介绍下————在⼀些祖传⽼代码当中,可能遇到过类似这样⼜臭⼜冗余的if-else写法:

public String getDay(String day){ if(\"Monday\".equals(day)){ return \"今天上英语课\";

}else if(\"Tuesday\".equals(day)){ return \"今天上语⽂课\";

}else if(\"Wednesday\".equals(day)){ return \"今天上数学课\";

}else if(\"Thursday\".equals(day)){ return \"今天上⾳乐课\";

}else if(\"Sunday\".equals(day)){ return \"今天上编程课\"; }else{ ...... }}

这时,可以根据具体场景,来考虑是否可以利⽤Map优化,使⽤Map优化的⽅式,是先在该类中定义⼀个static的map,类似这样:

public static final Map dayMap= ImmutableMap.builder() .put(\"Monday\今天上英语课\") .put(\"Tuesday\今天上语⽂课\") .put(\"Wednesday\今天上数学课\") .put(\"Thursday\今天上⾳乐课\") .put(\"Sunday\今天上编程课\") .build();

定义完后,就直接在先前使⽤if-else的⽅法⾥,进⾏这样优化:

public String getDay(String day){ return dayMap.get(day);}

这样优化后,业务⽅法⾥的判断获取值的处理,是不是就清爽了很多,当然,这只是针对量⽐较多的if-else⽽⾔,若是⽐较少的判断语句,再额外定义⼀个map来搞,隐约有画蛇添⾜的嫌疑。

细⼼的读者可能会发现, 我在定义map的时候,使⽤到了⼀个ImmutableMap的东西,这是Google Guava⾥的⼀个类,可⽣成⼀个不可变的Map对象,这就意味着,初始化定义后,后续就⽆法再put修改了,它的这个特性可以保证线程的安全。⼀般⽤来替换if-else的map,我们就是要求在初始化定义后,就不会再允许修改了,因此,这个ImmutableMap⽣成的map,可以很好地帮我们实现这⼀点。另外,最重要⼀点是,使⽤这个ImmutableMap,可以实现链式编程,就像上⾯定义的链式写法,若是⽤传统的map定义,就每次都要map.put()、map.put()地赋值。关于ImmutableMap的原理,我专门写⼀篇⽂章来介绍

五、使⽤枚举优化if-else

前⾯提到过可使⽤策略枚举来优化⼤批量的if-else,当然,若只是判断获不同条件来取值的代码,可以考虑直接使⽤枚举来优化,其效果与map的处理效果类似。还是⽤前⾯判断课程的if-else为案例来优化。⾸先,先在类中定义⼀个枚举:

public enum dayEnum { Monday(\"今天上英语课\"), Tuesday(\"今天上语⽂课\"), Wednesday(\"今天上数学课\"), Thursday(\"今天上⾳乐课\"), Sunday(\"今天上编程课\"); public String value; dayEnum(String value){ this.value=value; }}

定义完后,就可以类似前⾯map的⽅式,直接将判断值去枚举⾥获取,然后直接返回获取到的值,这样写法是不是也⽐较优雅了。

public String getDay(String day){

return dayEnum.valueOf(day).value;}

六、使⽤Optional类优化if-else

在实际⼯作中,我曾经遇到类似这样的代码,看起来像没什么问题,但如果其中某个属性值不幸为null,那么,恭喜你,你将会喜提⼀个NullPointerException异常。

String name=school.getGrades().getStuendt().getName();

若要处理这个可能出现的空指针异常,传统写法,可以写⼀堆if-else语句来处理,就像这样⼦——

String name=null;if(school!=null){

Grades grade=school.getGrades(); if(grade!=null){

Student student=grade.getStuendt(); if(student!=null){

name = student.getName(); } }}

作为⼀个极度讨厌if-else的⼈⼠,怎么能容忍这⼀堆层层嵌套的代码存在呢!

在遇到这种层层嵌套的if-else判断时,可以考虑使⽤jdk1.8新特性Optional 类来优化,优化后的效果如下,顿时⼜优雅了很多。

String name = Optional.ofNullable(school) .flatMap(School::getGrades)

.flatMap(Grades::getStuendt) .map(Student::getName) .orElse(null);

总结

本篇⽂章就到这⾥了,希望能给您带来帮助,也希望您能够多多关注的更多内容!

因篇幅问题不能全部显示,请点此查看更多更全内容

Top