1

我遇到了这个源代码,并想确保我理解它为什么按原样编写(或者是否应该这样):

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 声明的问题:

  1. 为什么要使用位运算符?retainAll() 将返回一个关于发生了什么的布尔值?

  2. 运算符/语句在说什么?如果 modified 等于返回值,则保留 modified 的值,或者如果返回值不同,则设置为该新值?

4

5 回答 5

1

意思是说,如果其中一个modifiedretainAll()为真,那么modified应该为真。(给定名称这是有道理的。retainAll仅在 更改 时返回 true Set,并且someMysteriousMethod可能返回 true 或 false 取决于状态是否Set已更改。)

代码分解为:

modified = modified | visibleSites.retainAll(possibleSites);

查看以下代码以查看|on 布尔值的结果:

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,所以在代码中,两者modifiedretainAll必须返回 falsemodified才能成为false

于 2019-03-13T16:45:03.370 回答
1
boolean retainAll(Collection<?> c)

true如果返回the set changed as a result of the call

modified |= visibleSites.retainAll(possibleSites);

所以上述语句的意思是,如果modifiedretainAll返回,则modified设置为,否则modified

于 2019-03-13T16:46:25.843 回答
0

retainAll方法 inSet的返回值指示该集合是否被调用更改。

回报:

true如果这个集合由于调用而改变

此处,true表示该集合已被修改。复合运算符对|=参数执行“或”并将其分配回左侧。对于您的情况,这意味着如果retainAll返回true,则分配truemodified,否则modified保持不变。

于 2019-03-13T16:50:00.517 回答
0

根据javadoc,

retainAll如果true此集合因调用而更改,则返回

a |= b是影响 " a or b" to结果的操作a。因此,在您的情况下,想法是影响modified语句“visibleSites被修改之前OR visibleSites被修改retainAll”的结果

于 2019-03-13T16:51:37.850 回答
0

在这之后:

修改 = someMysteriousMethod();

那么modified可能是真的,也可能不是。效果如下:

修改 |= visibleSites.retainAll(possibleSites);

就是modified如果它已经为真,则将其设置为真,如果其他条件成立,则将其从假更改为真(我故意说效果,我不是在描述实际的指令操作)。

第二个语句可以写成

if (visibleSites.retainAll(possibleSites)) {
      modified = true;
}

以同样的结果。在某种程度上,这是一个品味问题。我发现原文(使用|=运算符)更易于阅读,因为它是一个简单的直线逻辑表达式,而不是控制流语句

顺便说一句,它不被称为“按位”运算符。Java有两个'|' 和两个对应的 '|=' 运算符;在整数之间是按位或,在布尔值之间是逻辑或

于 2019-03-14T02:03:25.807 回答