之前我用 Java 8 写了一段逻辑,就是类似下面这样的例子:

/*
* 来源公众号:Java技术栈
*/
if(xxxOrder != null){
if(xxxOrder.getXxxShippingInfo() != null){
if(xxxOrder.getXxxShippingInfo().getXxxShipmentDetails() != null){
if(xxxOrder.getXxxShippingInfo().getXxxShipmentDetails().getXxxTrackingInfo() != null){
...
}
}
}
}

要逐个判空再取最后的不为空的值,这样写,如果 if 多了就极不优雅,于是,我利用了 Java 8 的 Optional.map 方法干掉了层层 if,同事直呼看不懂,没看过的可以点击这里进行阅读。

最近又来了个奇怪的需求,大概的逻辑是这样的,有一个参数,如果该值为空,就依次取几个备用参数的值,如果几个备用的参数都为空,最后取默认值。

如:取 info 的值,如果 info 为空,就依次取 info1, info2, info3, info4 的值,如果都为空,就取系统默认值。

感觉就是和上次的场景完全相反,上次是依次判断不为空取最后的值,这个是取第一个不为空的值。

实现方案1

if/else 来实现:

/*
* 来源公众号:Java技术栈
*/
String info = xx.getInfo();
if (info == null) {
info = xx.getInfo1();
if (info == null) {
info = xx.getInfo2();
if (info == null) {
info = xx.getInfo3();
if (info == null) {
info = xx.getInfo4();
if (info == null) {
info = "Java技术栈(默认)";
}
}
}
}
}

我敢打赌,肯定会有人会这么写,这样写很不优雅,如果备用值有很多个,那不是要疯了。。

实现方案2

当然,还有这样的写法:

/*
* 来源公众号:Java技术栈
*/
String info = null;
if (xx.getInfo() != null) {
info = xx.getInfo();
} else if (xx.getInfo1() != null) {
info = xx.getInfo1();
} else if (xx.getInfo2() != null) {
info = xx.getInfo2();
} else if (xx.getInfo3() != null) {
info = xx.getInfo3();
} else if (xx.getInfo4() != null) {
info = xx.getInfo4();
} else {
info = "Java技术栈";
}

这个写法要比第一个要好点,也是用的比较多的写法。

实现方案3(推荐)

上面那个也是层层 if 还有 else if,也不是很优雅,在很多书中也不推荐这么写,而推荐这么写:

/*
* 来源公众号:Java技术栈
*/
public String getInfo(XX xx)
if (xx.getInfo() != null) {
return xx.getInfo();
} if (xx.getInfo1() != null) {
return xx.getInfo1();
} if (xx.getInfo2() != null) {
return xx.getInfo2();
} if (xx.getInfo3() != null) {
return xx.getInfo3();
} if (xx.getInfo4() != null) {
return xx.getInfo4;
} return "Java技术栈";
}

这样写稍微聪明点,也是推荐的写法,单独抽取一个方法,依次返回,这样可以避免过多的 if/else 而导致潜在的逻辑混乱的可能。

实现方案4(终极推荐)

即使这样,感觉代码还是不是很好看,if 判断太多了,下面看栈长我如何用 Java 8 干掉这些 if/else 吧!

Java 8 方案示例:

/*
* 来源公众号:Java技术栈
*/
List<String> list = new ArrayList<>(Arrays.asList(info, info1, info2, info3, info4, "Java技术栈(默认)"));
list.removeIf(StringUtils::isBlank);
String result = list.get(0);

3行搞定,爽!!!

是怎样实现的呢?我们逐行展开分析下:

  • 依次用每个参数构建一个List
  • 移除所有为空的参数
  • 找出第一个不为空的参数

利用 Java 8 新增的 removeIf 方法巧妙的干掉了 if/else,并且可以使用 Lambda 表达式或者方法引用,是不是很优雅呢?

本来想利用 Stream 一行搞定的,无奈 Stream 不能接收 null 参数,不然报指针异常。

关于这段 if/else 逻辑你还知道别的改进方式吗?欢迎留言分享!

本次的分享就到这里了,希望对大家有用。觉得不错,在看、转发分享一下哦~

关注Java技术栈微信公众号,栈长将继续分享好玩的 Java 技术,公众号第一时间推送,关注公众号还可以在菜单中获取历史 Java 教程,都是干货。

近期热文推荐:

1.Java 15 正式发布, 14 个新特性,刷新你的认知!!

2.终于靠开源项目弄到 IntelliJ IDEA 激活码了,真香!

3.我用 Java 8 写了一段逻辑,同事直呼看不懂,你试试看。。

4.吊打 Tomcat ,Undertow 性能很炸!!

5.《Java开发手册(嵩山版)》最新发布,速速下载!

觉得不错,别忘了随手点赞+转发哦!

if else 太多?看我用 Java 8 轻松干掉!的更多相关文章

  1. 看了这个Java实习生入职测试题后,幸亏我不是实习生

    看了这个Java实习生入职测试题后,幸亏我不是实习生 一个Java实习生的入职测试题,你能答对几个? 今天在某APP中看到,有实习生放出的Java实习生入职测试题.看完之后,很庆幸自己不是实习生. 本 ...

  2. 看过无数Java GC文章,这5个问题你也未必知道!

    看过无数Java GC文章,这6个问题你也未必知道! 读者朋友们可能已经看过太多关于Java垃圾回收相关的文章,如果没有,墙裂安利大家看下面这篇: 看完这篇垃圾回收,和面试官扯皮没问题了 本文不再重复 ...

  3. 【实习记】2014-08-15文档太少看着源码用cgicc+stl库之模板谓词函数对象

        总结1: 今天找到了昨天scanf的问题答案,scanf与printf一样的神奇而复杂,稍不留神,就会被坑.scanf函数在读入非空白符分割的多个字符串的解决方法是这个:/* 以 | 分割 * ...

  4. 不要写很酷但同事看不懂的Java代码

    你好呀,我是沉默王二,一个和黄家驹一样身高,和刘德华一样颜值的程序员.为了提高 Java 编程的技艺,我最近在 GitHub 上学习一些高手编写的代码.下面这一行代码(出自大牛之手)据说可以征服你的朋 ...

  5. 写给小白看的入门级 Java 基本语法,强烈推荐

    之前写的一篇我去阅读量非常不错,但有一句留言深深地刺痛了我: 培训班学习半年,工作半年,我现在都看不懂你这篇文章,甚至看不下去,对于我来说有点深. 从表面上看,这句话有点讽刺我的文章写得不够通俗易懂的 ...

  6. 在家看电影音效太差?Boom 3D帮你轻松升级

    新片上映后,很多人都会选择去电影院观看,一是为了第一时间看到电影,还有一个原因就是电影院的音效往往可以让人身临其境,更好地感受电影的氛围.那如果在家刷片我们该怎么办呢? 我们可以使用Boom 3D这款 ...

  7. 透过现象看本质:Java类动态加载和热替换

    摘要:本文主要介绍类加载器.自定义类加载器及类的加载和卸载等内容,并举例介绍了Java类的热替换. 最近,遇到了两个和Java类的加载和卸载相关的问题: 1) 是一道关于Java的判断题:一个类被首次 ...

  8. 如何写出同事看不懂的Java代码?

    原创:微信公众号 码农参上,欢迎分享,转载请保留出处. 哈喽大家好啊,我是没更新就是在家忙着带娃的Hydra. 前几天,正巧赶上组里代码review,一下午下来,感觉整个人都血压拉满了.五花八门的代码 ...

  9. 看think in java 随笔

    java的方法是运行期动态绑定上去的,可以根据自己真正实例化的类来判断调用哪个方法,比如子类重写了父类方法,会调用子类方法. 而利用final关键字可以让方法不能重写,就可以在编译期就绑定,这样就可以 ...

随机推荐

  1. (专题四)06 matlab绘图选项卡

    绘图选项卡 例子1--选择已有变量,绘制图形 都是按照选中的先后顺序依次确定坐标, 如果要修改绘制图形 法一,利用绘图工具和停靠图形按钮 法二,命令行窗口中输入命令 >>plottools ...

  2. 《Java从入门到失业》第四章:类和对象(4.4):方法参数及传递

    4.4方法参数及传递 关于这个知识点,我想了很久该不该在这里阐述.因为这个知识点稍微有点晦涩,并且就算不了解也不影响用Java编写代码.不过笔者刚开始工作的时候,就是因为这块内容没有过多的关注,以至于 ...

  3. 容器云平台No.9~kubernetes日志收集系统EFK

    EFK介绍 EFK,全称Elasticsearch Fluentd Kibana ,是kubernetes中比较常用的日志收集方案,也是官方比较推荐的方案. 通过EFK,可以把集群的所有日志收集到El ...

  4. python安装scrapy库失败

    解决方法: 首先,下载Twisted.cp后数字为python版本,例如cp36为python3.6:amd则表示系统位数,例如amd64为64位.下载对应版本即可.点击打开链接 找到Twisted, ...

  5. php第五天-正则表达式,字符串的匹配与查找函数,数组切割

    在php中有两套正则表达式,两者功能相似,一套是由PCRE,使用"preg_"为前缀命名的函数,一套是由POSIX拓展提供的,使用以"ereg_"命名的函数 0 ...

  6. Centos-目录或文件拷贝-cp

    cp 拷贝或者备份文件或者目录 相关选项 -a 拷贝目录保存文件所有信息 -r  递归拷贝目录 -d 保留连接 -p 保留修改时间和存取权限 -i 有同名提醒是否覆盖 相关应用 1. 备份文件 cp ...

  7. 分享一些比较好用的(免费)网站及推荐理由 SMARK

    分享一些比较好用的(免费)网站及推荐理由 --By SMARK 资源类 这里面是一些有供下载的资源的网站等 视频 片库 内容怎么样有待考证 蓝光网 看着还行, 打赏收入 预告片世界 还行, 收入有待考 ...

  8. 00 在Windows环境中开发Cordova项目的准备工作

    1.开发环境准备:     安装nodejs     安装Cordova     安装Visual Studio Code     安装nodejs步骤:     通过nodejs官网(https:/ ...

  9. 060 01 Android 零基础入门 01 Java基础语法 06 Java一维数组 07 冒泡排序

    060 01 Android 零基础入门 01 Java基础语法 06 Java一维数组 07 冒泡排序 本文知识点:冒泡排序 冒泡排序 实际案例分析冒泡排序流程 第1轮比较: 第1轮比较的结果:把最 ...

  10. arduino中驱动 步进电机

    参考:https://www.arduino.cn/thread-75936-1-1.html 知识点:    步进电机是一种将电脉冲转化为角位移的执行机构.通俗一点讲:当步进驱动器接收到一个脉冲信号 ...