Java的简短形式如果Else声明

use*_*985 28 java if-statement short ternary-operator

我有一个检查空值的方法.有没有办法减少方法中的行数?目前,代码看起来"脏":

private int similarityCount (String one, String two) {

    if (one == null && two == null) {
        return 1;
    } else if (one == null && two != null) {
        return 2;
    } else if (one != null && two == null) {
        return 3;
    } else {
        if(isMatch(one, two))
             return 4;
        return 5;
    }

}
Run Code Online (Sandbox Code Playgroud)

Man*_* Le 61

private int similarityCount (String one, String two) {

    if (one == null && two == null) {
        return 1;
    } 

    if (one == null) {
        return 2;
    } 

    if (two == null) {
        return 3;
    } 

    if (isMatch(one, two)) {
        return 4;
    }
    return 5;
}
Run Code Online (Sandbox Code Playgroud)

  • 您甚至可以从第二个`if`中删除`&& two!= null`,因为当代码的这一部分到达执行时它总是不是'null`.您还可以使用`assert`来声明某些执行路径上的变量的非空值(无论如何,`-ea`,这应该是默认值). (5认同)
  • 这很清楚,复杂度低. (3认同)
  • 为什么`isMatch(一,二)`的三元组?为什么不只是另一个if语句?这与现有的流量相比会更好,阅读更顺畅. (3认同)

Era*_*ran 33

在这种情况下,我更喜欢嵌套条件:

private int similarityCount (String one, String two) {
    if (one==null) {
        if (two==null) {
            return 1;
        } else {
            return 2;
        }
    } else {
        if (two==null) {
            return 3;
        } else {
            return isMatch(one, two) ? 4 : 5;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

当然,您可以通过使用更多的三元条件运算符来实现更短的版本.

private int similarityCount (String one, String two) {  
    if (one==null) {
        return (two==null) ? 1 : 2;
    } else {
        return (two==null) ? 3 : isMatch(one, two) ? 4 : 5;
    }
}
Run Code Online (Sandbox Code Playgroud)

甚至(现在这变得越来越不可读):

private int similarityCount (String one, String two) {  
    return (one==null) ? ((two==null) ? 1 : 2) : ((two==null) ? 3 : isMatch(one, two) ? 4 : 5);
}
Run Code Online (Sandbox Code Playgroud)

  • 努力值得提升 (4认同)
  • 我不得不说我发现这种说法逻辑很复杂.它将`null`检查拆分为两个一般情况`one == null`和`one!= null`,实际上,我们真的*感兴趣的是`one`或`two`是'null`,或两者都不 因此,我建议反对此处提供的所有选项. (4认同)

Kon*_*lph 25

由于函数的实际目的似乎是null通过匹配它们来处理非对象,所以我将null在开头处理一个guard语句中的所有检查.

然后,一旦你确定没有参数null,你就可以处理实际的逻辑:

private int similarityCount(String a, String b) {
    if (a == null || b == null) {
        return a == b ? 1 : a == null ? 2 : 3;
    }

    return isMatch(a, b) ? 4 : 5;
}
Run Code Online (Sandbox Code Playgroud)

这比其他选项更简洁,更易读.

也就是说,实际函数通常不会返回这样的数字代码.除非你的方法被简化以证明问题,否则我强烈建议你重新考虑逻辑,而是写下类似于下面的内容:

private boolean similarityCount(String a, String b) {
    if (a == null || b == null) {
        throw new NullPointerException();
    }

    return isMatch(a, b);
}
Run Code Online (Sandbox Code Playgroud)

要么:

private boolean similarityCount(String a, String b) {
    if (a == null) {
        throw new IllegalArgumentException("a");
    }
    if (b == null) {
        throw new IllegalArgumentException("b");
    }

    return isMatch(a, b);
}
Run Code Online (Sandbox Code Playgroud)

这些方法更为传统.另一方面,它们可能会触发异常.我们可以通过java.util.Optional<Boolean>在Java 8中返回来避免这种情况:

private Optional<Boolean> similarityCount(String a, String b) {
    if (a == null || b == null) {
        return Optional.empty();
    }

    return Optional.of(isMatch(a, b));
}
Run Code Online (Sandbox Code Playgroud)

乍一看,这似乎并不比回归更好,null选择权实际上要优越得多.


def*_*ale 9

代码对我来说看起来很清楚.您可以使用嵌套和三元运算符缩短它:

if(one==null) {
    return two==null ? 1 : 2;
}
if(two==null) {
    return 3;
} 
return isMatch(one,two) ? 4 : 5;
Run Code Online (Sandbox Code Playgroud)


Sac*_*wgi 5

它可以使用Java条件运算符在一行中完成:

return (one==null?(two==null?1:2):(two==null?3:(isMatch(one,two)?4:5)));
Run Code Online (Sandbox Code Playgroud)

  • 仅仅因为*可以*完成,并不意味着它应该:) (15认同)

Dan*_*umb 5

可以创建一个伪查找表。有些人不喜欢嵌套的三元运算符,它高度依赖空格来提高可读性,但它可以是一种非常易读的条件返回方法:

private int similarityCount (String one, String two) {
    return (one == null && two == null) ? 1
         : (one == null && two != null) ? 2
         : (one != null && two == null) ? 3
         : isMatch(one, two)            ? 4
         :                                5;
}
Run Code Online (Sandbox Code Playgroud)