异或布尔表达式

nim*_*o23 6 java equality simplify

我有这个:

// returns true if both are equal (independent of scale) and also checks against null
public static boolean isEqual(BigDecimal val1, BigDecimal val2) {
        // 1. check: both will be null or both will be non-null.
        if (val1 != null ^ val2 != null) return false;
        // 2. check: if not null, then compare if both are equal
        return !(val2 != null && val1.compareTo(val2) != 0);
    }
Run Code Online (Sandbox Code Playgroud)

我想将布尔表达式合并为一个。所以我用这个:

public static boolean isEqual(BigDecimal val1, BigDecimal val2) {
    return !(val1 != null ^ val2 != null) && !(val2 != null && val1.compareTo(val2) != 0);
}
Run Code Online (Sandbox Code Playgroud)

但是,我担心这是否正确。它是否正确?可以简化/缩短吗?

借助答案,简化的解决方案是:

// returns true, if both are null or both are equal 
// (independent of their numbers scales)
public static boolean isEqual(BigDecimal val1, BigDecimal val2) {
    return val1 == null ? val2 == null : val2 != null && val1.compareTo(val2) == 0;
}
Run Code Online (Sandbox Code Playgroud)

Joh*_*ica 8

使用^作为一个逻辑XOR运算符是极不寻常的。它可以工作,但是出于可读性考虑,我会避免使用它。!=是一个很好的替代品。

return !((val1 != null) != (val2 != null)) && !(val2 != null && val1.compareTo(val2) != 0);
Run Code Online (Sandbox Code Playgroud)

现在,您可以将双重否定替换为==。真好

return ((val1 != null) == (val2 != null)) && !(val2 != null && val1.compareTo(val2) != 0);
Run Code Online (Sandbox Code Playgroud)

您还可以!通过De Morgan的法律分配剩余的款项

return ((val1 != null) == (val2 != null)) && (val2 == null || val1.compareTo(val2) == 0);
Run Code Online (Sandbox Code Playgroud)

更好,但是老实说,我仍然觉得它很笨拙。即使不是单行语句,我也会更简单一些:

if (val1 == null) {
    return val2 == null;
}
else {
    return val2 != null && val1.compareTo(val2) == 0;
}
Run Code Online (Sandbox Code Playgroud)

您可以使用三元运算符代替if/ else。根据个人喜好,您会更容易阅读:

return val1 == null
    ? val2 == null
    : val2 != null && val1.compareTo(val2) == 0;
Run Code Online (Sandbox Code Playgroud)

您提到需要使用compareTo()。对于其他可能会阅读此答案的人,如果您不必使用,compareTo()我会equals()改用。

if (val1 == null) {
    return val2 == null;
}
else {
    return val1.equals(val2);
}
Run Code Online (Sandbox Code Playgroud)

然后,碰巧的是,您甚至根本不需要编写此方法。内置Objects.equals()方法正是这样做的:如果两个对象相等,或者它们都为null,则返回true。