gpt4 book ai didi

java - 使用 XOR 对 boolean 表达式求反

转载 作者:行者123 更新时间:2023-12-02 11:23:57 27 4
gpt4 key购买 nike

我有这个:

// 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);
}

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

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

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

在答案的帮助下,缩短解决方案是:

// 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;
}

最佳答案

使用 ^ 作为逻辑 XOR 运算符是非常不寻常的。它有效,但为了可读性我会避免它。 != 是一个很好的替代品。

return !((val1 != null) != (val2 != null)) && !(val2 != null && val1.compareTo(val2) != 0);

现在您可以用 == 替换双重否定。不错。

return ((val1 != null) == (val2 != null)) && !(val2 != null && val1.compareTo(val2) != 0);

您还可以通过De Morgan's laws分发剩余的! :

return ((val1 != null) == (val2 != null)) && (val2 == null || val1.compareTo(val2) == 0);

好多了,但说实话我还是觉得不太方便。即使不是单行语句,我也会选择更简单的内容:

if (val1 == null) {
return val2 == null;
}
else {
return val2 != null && val1.compareTo(val2) == 0;
}

您可以使用三元运算符代替 if/else。根据个人喜好,您认为哪种更具可读性:

return val1 == null
? val2 == null
: val2 != null && val1.compareTo(val2) == 0;
<小时/>

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

if (val1 == null) {
return val2 == null;
}
else {
return val1.equals(val2);
}

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

关于java - 使用 XOR 对 boolean 表达式求反,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58032709/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com