我遇到了此源代码,并想确保我理解为什么按原样编写(或应该如此):
boolean modified = false;
Set<String> possibleSites = settings.getPossibleSites();
Set<String> visibleSites = settings.getVisibleSites();
modified = someMysteriousMethod();
// Remove sites from visibleSites that are not in possibleSites
modified |= visibleSites.retainAll(possibleSites);
我对LAST语句的疑问:
为什么使用按位运算符? keepAll()将返回一个布尔值,表示发生了什么情况?
操作员/语句在说什么?如果修改等于返回值,则仅保留修改值,还是如果返回值不同,则将修改后的值设置为该新值?
答案 0 :(得分:1)
这意味着如果modified
或retainAll()
为真,则modified
应该为真。 (给定名称的含义是合理的。retainAll
仅在更改{{1}时返回true,而Set
可能返回true或false取决于someMysteriousMethod
的状态是否更改)
代码分解为:
Set
请看以下代码,以查看布尔值上modified = modified | visibleSites.retainAll(possibleSites);
的结果:
|
输出:
System.out.println(true|true);
System.out.println(false|true);
System.out.println(true|false);
System.out.println(false|false);
(只有true
true
true
false
会返回false|false
,因此在代码中,false
和modified
都必须返回false,retainAll
才能成为{{ 1}})
答案 1 :(得分:1)
boolean retainAll(Collection<?> c)
如果true
则返回the set changed as a result of the call
modified |= visibleSites.retainAll(possibleSites);
因此,上述声明意味着,如果modified
为 true 或retainAll
返回 true ,则modified
设置为< strong> true ,否则modified
的值为 false
答案 2 :(得分:0)
返回值retainAll
method in Set
表示呼叫是否更改了该集合。
返回:
true
(如果此设置因通话而更改)
在这里true
表示该集合已被修改。 |=
复合运算符在参数上执行“或”并将其分配回左侧。对于您的情况,这意味着如果retainAll
返回true
,则将true
分配回modified
,否则将modified
保持不变。
答案 3 :(得分:0)
根据javadoc
retainAll
重新调整true
,如果此设置因通话而改变
a |= b
是一种会影响“ a or b
”到“ a
”结果的操作。
因此,根据您的情况,想法是使语句“ modified
在visibleSites
被OR
修改visibleSites
retainAll
之前被修改的结果”
答案 4 :(得分:0)
之后:
modified = someMysteriousMethod();
然后modified
可能为true,也可能不是。的效果:
修改| = visibleSites.retainAll(possibleSites);
是将modified
设置为true(如果已经为true),如果其他条件成立则将其从false更改为true(我故意说 effect ,我并不是在描述实际指令操作)。
第二条语句可以写为
if (visibleSites.retainAll(possibleSites)) {
modified = true;
}
具有相同的结果。在某种程度上这是一个品味问题。我发现原始文档(使用|=
运算符)更易于阅读,因为它是一个简单的直线逻辑表达式,而不是控制流语句
顺便说一句,它不被称为“按位”运算符。 Java有两个'|'和两个相应的“ | =”运算符;在整数之间为bitwise-or,在布尔值之间为logical-or。