Java 中的快捷方式“or-assignment”(|=)运算符

我在Java中要做一长串的比较,我想知道其中一个或多个是否是正确的。比较字符串很长,难以阅读,所以我为了可读性而将其分解,并自动使用快捷运算符而不是。|=negativeValue = negativeValue || boolean

boolean negativeValue = false;
negativeValue |= (defaultStock < 0);
negativeValue |= (defaultWholesale < 0);
negativeValue |= (defaultRetail < 0);
negativeValue |= (defaultDelivery < 0);

如果任何默认值<某些>值为负值,我希望为 true。这有效吗?它会做我期望的吗?我无法在Sun的网站或stackoverflow上看到它,但Eclipse似乎没有问题,代码编译和运行。negativeValue


同样,如果我想执行几个逻辑交集,我可以使用代替吗?&=&&


答案 1

是布尔逻辑运算符 (JLS 15.22.2) 的复合赋值运算符 (JLS 15.26.2);不要与条件或(JLS 15.24)混淆。还有对应于复合赋值版本的布尔逻辑和分别。|=|||&=^=&^

换句话说,对于 ,这两个是等价的:boolean b1, b2

 b1 |= b2;
 b1 = b1 | b2;

逻辑运算符 (和 ) 与它们的条件对应运算符 ( 和 ) 之间的区别在于前者不 “短路”;后者确实如此。那是:&|&&||

  • &始终计算两个操作数|
  • &&有条件地评估正确的操作数;仅当正确的操作数的值可能影响二进制操作的结果时,才会计算正确的操作数。这意味着在以下情况下不会计算正确的操作数:||
    • 的左操作数计算结果为&&false
      • (因为无论正确的操作数计算结果如何,整个表达式都是false)
    • 的左操作数计算结果为||true
      • (因为无论正确的操作数计算结果如何,整个表达式都是true)

所以回到你最初的问题,是的,这个结构是有效的,虽然不是和的等效快捷方式,但它确实计算了你想要的东西。由于使用运算符的右侧是简单的整数比较操作,因此不短路的事实是微不足道的。|==|||=|

在某些情况下,需要甚至需要短路,但您的方案不是其中之一。

不幸的是,与其他一些语言不同,Java没有和。这个问题在为什么Java没有条件和条件或运算符的复合赋值版本中讨论过?(&&=, ||=).&&=||=


答案 2

它不是“捷径”(或短路)运算符,||和 && are(如果他们已经知道基于 LHS 的结果,他们就不会评估 RHS),但它会在工作方面做你想要

作为差异的示例,如果为 null,则此代码将很好:text

boolean nullOrEmpty = text == null || text.equals("")

而这不会:

boolean nullOrEmpty = false;
nullOrEmpty |= text == null;
nullOrEmpty |= text.equals(""); // Throws exception if text is null

(显然,你可以为那个特定情况做 - 我只是试图证明这个原则。"".equals(text)