java - 用 XOR 对布尔表达式求反
问题描述
我有这个:
// 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);
}
我想将布尔表达式合并为一个。所以我用这个:
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);
您还可以!
通过德摩根定律分配剩余部分:
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()
方法正是这样做的:如果两个对象相等,或者它们都为空,则返回 true。
推荐阅读
- javascript - 将octave代码转换为js,无需重写所有内容
- python - 在 Django 中插入重复的列值
- python - 在numpy中随机选择不同的集合?
- flutter - 当我热重载或关闭应用程序时颤动它不会让用户保持登录状态
- twilio - 如何通过使用 Twilio-Python 发送数字来修改正在进行的呼叫?
- python-3.x - 如何导入从 create_app() 创建的应用程序实例
- javascript - 如何使用Javascript更改元素的文本而不消失?
- html - 如何在 HTML 中创建嵌套表格
- c# - 如何在 ASP.NET Web 应用程序中只加载一次数据表中的静态数据
- swift - Swift 中 flatMap 的定义