这个问题已经在这里有了答案: > What does “|=” mean? (pipe equal operator) 6个
我需要有关这个奇怪的运算符| =的帮助.您能告诉我这段代码的作用吗?
@Override
public boolean addAll(Collection<? extends E> c) {
boolean result = false;
for (E e : c) {
result |= add(e);
}
return result;
}
解决方法:
代码使用add()方法添加Collection的所有成员,该方法返回一个布尔值,指示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;
}
但这有点冗长,因为您可以直接对结果变量进行操作:
@Override
public boolean addAll(Collection<? extends E> c) {
boolean result = false;
for (E e : c) {
result = add(e) || result;
}
return result;
}
因此,我们在逻辑上将结果的旧值与add的返回值进行或运算,以获取新值. (注意-我们希望结果在||的右侧;这是因为||“短路”,并且如果左侧为true,则不必费心检查||的右侧).因此,如果add(e)和result相反,它将不会评估右侧-即结果为true时不运行add()方法.)
编写该方法的人决定他们要尽可能简洁,因此他们进行了更改:
result = add(e) || result;
至:
result |= add(e);
与以下内容相同:
result = result | add(e);
|
operator is a bitwise OR与逻辑OR并不相同,但布尔值的效果基本相同,唯一的区别是| |.没有上述短路行为.
Java中没有|| =语法,这就是使用按位OR的原因,尽管即使这样做也可能会遇到上述相同的短路问题.