专栏首页网络小说作家的编程技术沉思录Java编程技巧:if-else优化实践总结归纳

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

说实话,其实我很讨厌在代码里大量使用if-else,一是因为该类代码执行方式属于面向过程的,二嘛,则是会显得代码过于冗余。这篇笔记,主要记录一些自己在工作实践当中针对if-else的优化心得,将会不定期地长期更新。

一、使用策略枚举来优化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<String> set1=new HashSet<>();
Set<String> set2=new HashSet<>();

if(flag){
    set1.add(id);
}else{
    set2.add(id);
}    

利用三目运算符,可以直接优化成:

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

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

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

  • anyMatch:判断条件里任意一个满足条件,则返回true;
  • allMatch:判断条件里所有都满足条件,则返回true;
  • noneMatch:判断条件里所有都不满足条件,则返回true;

它们的使用方式其实很简单:

List<String> list = Arrays.asList("a", "b", "c","d", "");
//任意一个字符串判断不为空则为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<String,String> dayMap=  ImmutableMap.<String, String>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的原理,我专门写一篇文章来介绍:《Java源码分析:Guava之不可变集合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);

本文属于if-else优化编程技巧总结,后续若在实践中有新收获,将持续更新......

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Java程序性能优化之编程技巧总结

    程序的性能受代码质量的直接影响。在本文中,主要介绍一些代码编写的小技巧和惯例,这些技巧有助于在代码级别上提升系统性能。

    lyb-geek
  • Dimple在左耳听风ARTS打卡(十)

    题图:2019法网的纳达尔。小编是纳达尔多年的球迷了,从他第一个法网冠军开始就是小迷弟,尤其是在红土的统治力,以及他体现出来的意志力等等,是我学习的榜样。10个...

    程序员小跃
  • 双十一,我们除了能帮程序员省钱之外,还能帮你征个婚

    导读:从光棍节到购物狂欢节,双十一真是一年比一年热闹。怎样用一条图文简单方便地把这两个节一起过了,数据叔也是操碎了心。脑洞一开,办法还是有的:老规矩,送书啊!送...

    华章科技
  • ARTS-20-敏捷开发之LinkedIn的高效代码评审技巧

    Tip:主要是为了总结和归纳在日常工作中所遇到的知识点。学习至少一个技术技巧。在工作中遇到的问题,踩过的坑,学习的点滴知识。

    公众号_松华说
  • 我的写作工具链

    1)源文件持续修改中出现的回归编辑工作,互相引用的链接较多

    RiboseYim
  • 高效学习

    比如阅读或收听一个极客时间的专栏就属于被动学习,留存率 20% 左右,如果我们参与了评论,做课后练习,在实际项目中运用和实践,与他人分享,撰写博客,可以把留存率...

    超超不会飞
  • 如何提升Java应用程序性能

    【摘要】本文首先介绍了负载测试、基于APM工具的应用程序和服务器监控,随后介绍了编写高性能Java代码的一些最佳实践。最后研究了JVM特定的调优技巧、数据库端的...

    CSDN技术头条
  • 如何提升Java应用程序性能

    作者 | Eugen Paraschiv 翻译 | 雁惊寒 【摘要】本文首先介绍了负载测试、基于APM工具的应用程序和服务器监控,随后介绍了编写高性能Java代...

    企鹅号小编
  • 递归与数学归纳法

    递归与数学归纳法(RMI):Recursion and mathematical induction

    LeviMaster
  • 编写高性能 Java 代码的最佳实践

    摘要:本文首先介绍了负载测试、基于APM工具的应用程序和服务器监控,随后介绍了编写高性能Java代码的一些最佳实践。最后研究了JVM特定的调优技巧、数据库端的优...

    lyb-geek
  • Java架构师必看的10本书

    1、大型网站系统与JAVA中间件实践 本书围绕大型网站和支撑大型网站架构的Java中间件的实践展开介绍。 从分布式系统的知识切入,让读者对分布式系统有基本的了解...

    Java技术栈
  • 实用编程技巧汇总,让代码效率提高一个档次

    二者唯一的不同在于后者用len变量将字符串s的长度保存了,在条件判断时直接将i与len比较。

    老九君
  • PHP核心技术与最佳实践 - 列旭松,陈文

    《PHP核心技术与最佳实践》是一本致力于为希望成为中高级PHP程序员的读者提供高效而有针对性指导的经典著作。系统归纳和深刻解读了PHP开发中的编程思想、底层原理...

    用户3157710
  • 美团T9分享官方进阶文档:Nginx+Netty跟着案例学这两份开源手册

    Nginx是著名的Web服务器,性能优异,运行效率远超传统的Apache、Tomcat, 广泛应用于国内外诸多顶级互联网公司。

    马士兵的朋友圈
  • Dimple在左耳听风ARTS打卡(第七期)

    所谓ARTS: 每周至少做一个LeetCode的算法题;阅读并点评至少一篇英文技术文章;学习至少一个技术技巧;分享一篇有观点和思考的技术文章。(也就是Algor...

    程序员小跃
  • 2018上半年这10本新书,技术大牛们都在追着看

    不知你的上半年都有哪些收获?上半年只收获了8斤体重的数据叔惶恐地抄下了郑州地铁上看到的名言警句:

    华章科技
  • 码农的数学和算法入门

    虽然是段子,但其实也挺写实的,因为你打开各大招聘网站,会发现越是高薪的IT岗位,对数学的要求越高。其实,我曾经也不太明白数学为什么对程序员很重要,不明白为什么在...

    FunTester
  • 重构:一项常常被忽略的基本功

    五月初的时候朋友和我说《重构》出第 2 版了,我才兴冲冲地下单,花了一个礼拜时间一口气把它读完后,才有了这篇书评。掩卷沉思,我无比赞同豆瓣网友“天心一”的评论:...

    Fundebug
  • 告别狗屎代码,请记住这 11 条编码秘诀!

    我已经写了20年代码了,在此期间曾与17个团队共事过,使用不同的语言做过数百个项目。

    Java技术栈

扫码关注云+社区

领取腾讯云代金券