查看原文
其他

if else 太多?看我用 Java 8 轻松干掉!

栈长 Java技术栈 2021-05-26

Java技术栈

www.javastack.cn

关注阅读更多优质文章



之前我用 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 教程,都是干货。



文末推荐


最近大家有在看什么书?

栈长今天推荐一本《Java深度调试技术》,看完绝对涨姿势!

Java系统越来越复杂,且很多系统不允许停机维护,这就给问题的定位带来了巨大的困难。本书将重点介绍问题定位技巧,借助这些技巧,读者可以快速找到解决问题的突破口。

本书内容涉及Java线程堆栈分析、性能瓶颈分析、内存泄漏分析和堆内存设置、并发和多线程、幽灵代码、常见的Java陷阱、数据库、字符集与编码、JVM运行参数、常用问题定位工具、计算架构与存储架构、开发语言等的选择、设计软件系统、工程实践、常见案例等内容。



怎么样?绝对涨姿势的一本书!!


另外,栈长好些日子没有送书了,今天免费包邮送出 10 本《Java深度调试技术》,祝你好运!


获取方式:

在文末留言,说说你遇到过的最难定位的 Java 问题,留言点赞前 5 名精选留言抽出 5 名免费获得此书,中奖的会获得我的回复通知,请及时根据通知提示获取


活动截止时间:2020/10/26 20:00


注意:后台已设置监控,恶意刷赞的取消获奖资格。


如果不想参与免费送书活动,你也可以直接上京东购买~


    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存