我需要有关这个奇怪的运算符|=
的帮助。你能解释一下这段代码的作用吗?
@Override
public boolean addAll(Collection<? extends E> c) {
boolean result = false;
for (E e : c) {
result |= add(e);
}
return result;
}
答案 0 :(得分:6)
这是一个简写:
result = result | add(e);
|
是按位OR运算符。
答案 1 :(得分:2)
它是result = result |的简写添加(E)。管道是bitwise or运算符。
答案 2 :(得分:2)
代码正在使用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
位于||
的右侧;这是因为||
“短路”并且不会检查{||
的右侧1}}如果左侧是true
)。因此,如果add(e)
和result
是另一种方式,则不会评估右侧 - 即不运行add()
方法 - 一旦result
为true
。)
无论是谁写了这种方法,他们都希望尽可能简洁,以便改变:
result = add(e) || result;
为:
result |= add(e);
与:
相同result = result | add(e);
|
operator is a bitwise OR与逻辑OR不同,除了效果基本相同的布尔值之外,唯一的区别是|
没有上面提到的短路行为。
Java中没有||=
语法,这就是使用按位OR的原因,尽管它确实会有上述相同的短路问题。
答案 3 :(得分:0)
它是result
和add(e)
的按位OR-ing并将其分配回结果。简写符号而不是写result = result | add(e)
答案 4 :(得分:0)
or-assign运算符(|=
)将LHS上的变量设置为先前包含的值,或者评估RHS的结果。对于布尔类型(如本例所示),当值为true时,它将变量更改为包含true(否则没有净效果)。它不短路评估。
该方法的总体效果是为参数集合的每个元素调用当前对象的add
方法,并且如果对add
的任何调用返回true,则返回true(即,如果在add
...)