有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java在任何标准库中都有对布尔集合实现逻辑操作的助手类吗?

我炮制了这个小助手类,想知道是否有地方可以从中窃取它,而不是重新实现轮子:

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,它似乎没有包含我需要的东西


共 (4) 个答案

  1. # 1 楼答案

    虽然@eng fouad response足够好,但我仍然建议使用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
    

    正如我所看到的:

    • 使用番石榴图书馆
    • 无需使用方法编写自己的类
    • 更好的可读性(IMHO)
  2. # 2 楼答案

    对{}答案的改进:

    如果boolean集合是nullempty,则以下代码返回false,否则对元素执行逻辑操作:

    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);
    }
    
  3. # 3 楼答案

    我不相信Java标准库中有任何部分提供了这种功能

    在某些语言中,这些函数被称为anyOf(用于or)或allOf(用于and)。在搜索实现这些函数的Java库时,您可能会有一些运气

    请注意,这里的代码可以进行一些优化。注意,如果你正在计算许多布尔值的和,一旦你找到一个false值,你就可以停下来说答案是false。类似地,如果您正在计算布尔值的OR,您可以在找到true值时立即停止,因为答案将是true。这本质上是short-circuit evaluation到对象列表的泛化,是andor在Scheme等语言中的一些版本的行为。由此得出以下结论:

    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;
        }
    }
    

    希望这有帮助

  4. # 4 楼答案

    这个怎么样:

    public static boolean and(Collection<Boolean> booleans)
    {
        return !booleans.contains(Boolean.FALSE);
    }
    
    public static boolean or(Collection<Boolean> booleans)
    {
        return booleans.contains(Boolean.TRUE);
    }