问题
我在Java中有很长的比较,我想知道它们中的一个或多个是否真实。比较字符串很长且难以阅读,因此我将其分解以便于阅读,并自动使用快捷方式operator|=而不是negativeValue = negativeValue || boolean。
boolean negativeValue = false;
negativeValue |= (defaultStock < 0);
negativeValue |= (defaultWholesale < 0);
negativeValue |= (defaultRetail < 0);
negativeValue |= (defaultDelivery < 0);
如果任何默认的值为负,我希望negativeValue为真。这有效吗?它会做我期望的吗?我在Sun的网站或stackoverflow上看不到它,但Eclipse似乎没有问题,代码编译和运行。
同样,如果我想执行几个逻辑交叉点,我可以使用&=而不是&&吗?
#1 热门回答(183 赞)
|=是布尔逻辑运算符|(JLS 15.22.2)的复合赋值运算符(JLS 15.26.2);不要与conditional-or||(JLS 15.24)混淆。还有&=和^=分别对应于布尔逻辑&和^的复合赋值版本。
换句话说,对于boolean b1, b2,这两个是等价的:
b1 |= b2;
b1 = b1 | b2;
与条件对应物(&&和||)相比,逻辑运算符(&和|)之间的区别在于前者不是"短路";后者呢。那是:
&和|总是评估两个操作数
&&和||有条件地评估正确的操作数;仅当右侧操作数的值可能影响二进制操作的结果时,才会对其进行求值。这意味着在以下情况下不计算右操作数:&&的左操作数计算为false(因为无论右操作数的计算结果如何,整个表达式都为false)||的左操作数求值为true(因为无论右操作数的计算结果如何,整个表达式都为真)
所以回到你原来的问题,是的,那个结构是有效的,而虽然216353670并不完全是=和||的等效快捷方式,但它确实可以计算你想要的东西。由于|=操作员的右侧使用是一个简单的整数比较操作,因此|不是短路的事实是微不足道的。
有些情况下,当需要短路或甚至需要短路时,但你的情况不是其中之一。
#2 热门回答(16 赞)
它不是||的"快捷方式"(或短路)运算符和&&是(因为如果他们已经知道基于LHS的结果,他们将不会评估RHS)但它会在工作方面做你想做的事情。
作为区别的一个例子,如果text为null,则此代码将没有问题:
boolean nullOrEmpty = text == null || text.equals("")
而这不会:
boolean nullOrEmpty = false;
nullOrEmpty |= text == null;
nullOrEmpty |= text.equals(""); // Throws exception if text is null
(显然你可以针对那个特例来做"".equals(text) - 我只是想证明这个原则。)
#3 热门回答(3 赞)
你可以只有一个陈述。在多行中表示它几乎与你的示例代码完全相同,只是不那么重要:
boolean negativeValue
= defaultStock < 0
| defaultWholesale < 0
| defaultRetail < 0
| defaultDelivery < 0;
对于最简单的表达式,使用|可以比||更快,因为即使它避免进行比较,也意味着隐式使用分支并且可能要贵很多倍。