我需要关于这个奇怪的运算符的帮助
|=
。你能给我解释一下这段代码的作用吗?
@Override
public boolean addAll(Collection<? extends E> c) {
boolean result = false;
for (E e : c) {
result |= add(e);
}
return result;
}
它是以下内容的简写:
result = result | add(e);
|
是按位或运算符。
代码使用
Collection
方法添加 add()
的所有成员,该方法返回 boolean
,指示 add()
是否成功。 addAll
方法所做的是,如果任何添加成功则返回 true
,如果所有添加都失败则返回 false
。 (这对我来说确实很奇怪,因为如果所有添加都成功,我只会返回true
,但我离题了。)
所以你可以这样做:
@Override
public boolean addAll(Collection<? extends E> c) {
boolean result = false;
for (E e : c) {
if (add(e)) {
result = true;
}
}
return result;
}
但这有点冗长,因为您可以更直接地对
result
变量进行操作:
@Override
public boolean addAll(Collection<? extends E> c) {
boolean result = false;
for (E e : c) {
result = add(e) || result;
}
return result;
}
所以我们在逻辑上将
result
的旧值与 add
的返回值进行逻辑或运算以获得新值。 (注意:我们希望 result
位于 ||
的右侧;这是因为 ||
“短路”并且如果左侧是||
)。因此,如果 true
和 add(e)
是相反的,它不会评估右侧 - 即不运行 result
方法 - 一旦 add()
是 result
。)写那个方法的人决定他们想要尽可能简洁,所以他们改变了:
true
至:
result = add(e) || result;
与:相同
result |= add(e);
result = result | add(e);
运算符是按位或
,它与逻辑或不同,除了效果基本相同的布尔值,唯一的区别是
|
没有上述短路行为。Java 中没有|
语法,这就是为什么要使用按位或,尽管即使使用了,它也可能会出现上述相同的短路问题。
||=
和
result
的按位或运算,并将其赋值回结果。速记符号而不是写add(e)
result = result | add(e)
) 将 LHS 上的变量设置为其先前包含的值与 RHS 的评估结果进行或运算。对于布尔类型(如本例所示),它会将变量更改为在值为 true 时包含 true(否则没有实际效果)。它做
not短路评估。 该方法的总体效果是为参数集合的每个元素调用当前对象的
|=
方法,如果对
add
的任何调用返回真(即,如果实际添加了任何东西,则返回真)对add
结果含义的合理假设……)