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)
使用^作为一个逻辑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。
| 归档时间: |
|
| 查看次数: |
113 次 |
| 最近记录: |