Существуют ли вспомогательные классы, которые реализуют логические операции над логическими коллекциями в любой из стандартных библиотек? - PullRequest
4 голосов
/ 09 января 2012

Я придумал этот маленький вспомогательный класс и хотел узнать, есть ли где-нибудь, где я могу его украсть, вместо того, чтобы заново реализовать колесо:

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 ]

12 голосов
/ 09 января 2012

Как насчет этого:

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

public static boolean or(Collection<Boolean> booleans)
{
    return booleans.contains(Boolean.TRUE);
}
2 голосов
/ 21 января 2012

Хотя ответ @ eng-fouad достаточно хорош, я все же предлагаю еще один, который использует Iterables.all () и Iterables.any () с равным Предикат:

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

В качестве плюсов я вижу:

  • Использует библиотеку Гуавы
  • Не нужно писать собственнуюкласс с методами
  • Лучшая читаемость (ИМХО)
1 голос
/ 09 января 2012

Я не верю, что есть какая-то часть Стандартных библиотек Java, которая обеспечивает именно эту функцию.

В некоторых языках они предоставляются в виде функций, называемых anyOf (для or) или allOf (для and). Возможно, вам повезет в поиске библиотек Java, реализующих эти функции.

Примечание. Код, который вы здесь видите, может быть немного оптимизирован. Обратите внимание, что если вы вычисляете AND для многих логических значений, как только вы найдете значение false, вы можете остановиться и сказать, что ответ - false. Точно так же, если вы вычисляете OR для логических значений, вы можете остановиться, как только найдете значение true, поскольку ответом будет true. По сути, это обобщение оценки короткого замыкания на списки объектов и поведение некоторых версий and и or в таких языках, как 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;
    }
}

Надеюсь, это поможет!

0 голосов
/ 21 августа 2018

Улучшение ответа @Eng.Fouad:

Следующий код возвращает false, если boolean collection = 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);
}
...