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 c) { boolean result = false; for (E e : c) { if (add(e)) { result = true; } } return result; } 

但是这有点冗长,因为您可以更直接地对result变量采取行动:

 @Override public boolean addAll(Collection c) { boolean result = false; for (E e : c) { result = add(e) || result; } return result; } 

因此,我们逻辑上将result的旧值与add的返回值进行或运算以获得新值。 (注意 – 我们希望result位于||的右侧;这是因为|| “shortcircuits”并且如果左侧为true ,则不打扰检查||的右侧)。 因此,如果add(e)result是相反的,它将不会评估右侧 – 即不运行add()方法 – 一旦resulttrue 。)

编写该方法的人决定他们希望尽可能简洁,以便他们改变:

 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 …的结果