我编造了这个小助手班,并想知道是否有任何地方我可以从中窃取它而不是重新实现轮子:
public class Booleans3 {
private Booleans3(){}
public static boolean and(Iterable<Boolean> booleans) {
boolean result = true;
for (Boolean boolRef : booleans) {
boolean bool = boolRef;
result &= bool;
}
return result;
}
public static boolean or(Iterable<Boolean> booleans) {
boolean result = false;
for (Boolean boolRef : booleans) {
boolean bool = boolRef;
result |= bool;
}
return result;
}
}
我查看了com.google.common.primitives.Booleans,但它似乎并不包含我需要的内容。
答案 0 :(得分:12)
这个怎么样:
public static boolean and(Collection<Boolean> booleans)
{
return !booleans.contains(Boolean.FALSE);
}
public static boolean or(Collection<Boolean> booleans)
{
return booleans.contains(Boolean.TRUE);
}
答案 1 :(得分:2)
虽然@ eng-fouad的答案已经足够好了,但我仍然建议另一个使用Iterables.all()和Iterables.any()和equalTo谓词的答案:
import java.util.Arrays;
import static java.lang.Boolean.FALSE;
import static java.lang.Boolean.TRUE;
import static com.google.common.collect.Iterables.all;
import static com.google.common.collect.Iterables.any;
import static com.google.common.base.Predicates.equalTo;
...
Iterable<Boolean> booleans = Arrays.asList(TRUE, TRUE, FALSE);
System.out.println(all(booleans, equalTo(TRUE)));
System.out.println(any(booleans, equalTo(TRUE)));
将打印
false
true
正如我所看到的那样:
答案 2 :(得分:1)
我不相信Java标准库中有任何部分可以提供这种功能。
在某些语言中,这些是以anyOf
(适用于or
)或allOf
(适用于and
)的功能提供的。您可能有幸找到实现这些功能的Java库。
注意 - 你在这里的代码可以进行相当多的优化。请注意,如果您计算许多布尔值的AND,则只要找到false
值,就可以停止并说明答案为false
。同样,如果您计算布尔值的OR,则可以在找到true
值后立即停止,因为答案为true
。这实质上是short-circuit evaluation对对象列表的概括,并且是在诸如Scheme之类的语言中某些版本的and
和or
的行为。这给出了以下内容:
public class ModifiedBooleans3 {
private ModifiedBooleans3(){}
public static boolean and(Iterable<Boolean> booleans) {
for (Boolean boolRef : booleans)
if (!boolRef)
return false;
return true;
}
public static boolean or(Iterable<Boolean> booleans) {
for (Boolean boolRef : booleans)
if (boolRef)
return true;
return false;
}
}
希望这有帮助!
答案 3 :(得分:0)
@Eng.Fouad
答案的改进:如果false
集合是boolean
或null
,则以下代码返回empty
,否则对元素进行逻辑运算:
public static boolean and(Collection<Boolean> booleans) {
return booleans != null && !booleans.isEmpty() && !booleans.contains(Boolean.FALSE);
}
public static boolean or(Collection<Boolean> booleans) {
return booleans != null && !booleans.isEmpty() && booleans.contains(Boolean.TRUE);
}