Java | =运算符问题
我需要有关这个奇怪的运算符的帮助|=
。 你能解释一下这段代码的作用吗?
@Override public boolean addAll(Collection c) { boolean result = false; for (E e : c) { result |= add(e); } return result; }
代码使用add()
方法add()
Collection
所有成员,该方法返回一个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
位于||
的右侧;这是因为||
“shortcircuits”并且如果左侧为true
,则不打扰检查||
的右侧)。 因此,如果add(e)
和result
是相反的,它将不会评估右侧 – 即不运行add()
方法 – 一旦result
为true
。)
编写该方法的人决定他们希望尽可能简洁,以便他们改变:
result = add(e) || result;
至:
result |= add(e);
这与:
result = result | add(e);
|
operator是一个按位OR ,它与逻辑OR不一样,除了布尔效应基本相同,唯一的区别是|
没有上面提到的短路行为。
Java中没有||=
语法,这就是使用按位OR的原因,尽管它确实可能具有上面提到的相同的短路问题。
这是一个简写:
result = result | add(e);
哪里的 是按位OR运算符。
它是result = result |的缩写 添加(E)。 管道是按位或运算符。
它是结果的按位OR-ing并add(e)
并将其分配回结果。 简写符号而不是写result = result | add(e)
result = result | add(e)
or-assign运算符( |=
)将LHS上的变量设置为先前包含的值,并使用评估RHS的结果进行OR-ed。 对于布尔类型(如本例所示),当值为true时,它将变量更改为包含true(否则没有净效果)。 它没有短路评估。
该方法的总体效果是为参数集合的每个元素调用当前对象的add
方法,并且如果要add
任何调用返回true,则返回true(即,如果实际添加了任何内容,则在关于含义的合理假设下add
…的结果