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

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

之前我用 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 参数,不然报指针异常。


相关文章
|
5月前
|
Java
Java中的if选择语句详解
Java中的if选择语句详解
47 1
|
5月前
|
Java
Java程序设计基础——if条件语句
Java程序设计基础——if条件语句
|
5月前
|
Java 测试技术
Java一分钟之-控制流程:if条件语句与switch
【5月更文挑战第8天】本文探讨了Java编程中的`if`和`switch`控制流程语句,强调了常见问题和易错点。对于`if`语句,需注意使用大括号避免逻辑错误,完整比较操作,以及理解`&&`和`||`的短路行为。在`switch`语句中,要注意只能基于常量进行判断,每个`case`后应有`break`,并提供`default`分支。避免错误的策略包括始终使用大括号、确保清晰的条件、进行代码审查和编写单元测试。掌握这些要点对编写高效、可维护的代码至关重要。
48 0
Java一分钟之-控制流程:if条件语句与switch
|
11月前
|
Java
Java的流程控制(选择结构语句 if ~ switch &循环结构语句dowhile ~ for)
程序执行的控制流程分为三种,也称为三种结构,分别是:顺序结构、和循环结构。 顺序结构指的是程序执行按照代码的编写顺序,依次从上往下开始执行,直到程序结束。程序的执行默认是顺序执行的
84 1
|
5月前
|
Java
Java中if语句
Java中if语句
37 0
|
11月前
|
Java
Java中的条件语句:if语句和switch语句的作用与区别
Java中的条件语句:if语句和switch语句的作用与区别
230 0
|
Java
java if
Java if语句是一种用于根据某个条件执行不同操作的控制结构。它会在执行前检查一个条件,如果条件为真,则执行if语句中的代码块,否则跳过if语句中的代码块。
50 0
|
Java
Java代码中的if语句优化(工厂模式+策略模式)
总所周知,认知复杂度是衡量方法控制流理解难度的指标, 认知复杂度高的方法将难以维护。so,这样的代码是十分难以维护的。
166 0
|
11月前
|
存储 算法 Java
百度搜索:蓝易云【如何Java中的大量的if else判断?】
以上是一些常用的优化技术,可以帮助简化代码并提高可维护性。根据具体的需求和情况,选择合适的优化方法来减少大量的if-else判断。
59 0
|
Java
java if
if (condition) { // 如果条件为真,执行这里的代码 } else { // 如果条件为假,执行这里的代码 }
42 0