细心的读者可能会发现, 我在定义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);本文属于编程技巧总结,后续将持续更新......