Проверьте, все ли значения на карте равны нулю

1

Мне нужно проверить, являются ли все значения на карте нулевыми, у меня есть этот метод, который я хочу заменить встроенным, если это возможно. Ограничения: Java 5 и доступ к библиотекам Apache Commons.

/* Checks if all values are null */
public static boolean isEmpty(Map<Dboid,?> aMap){

    boolean isEmpty = true;

    Iterator<?> it = aMap.entrySet().iterator();

    while(it.hasNext() && isEmpty){
        Object value = it.next();
        if(value != null) {
            isEmpty = false;
        }
    }

    return isEmpty;
}
Теги:
map

5 ответов

3
Лучший ответ

Как таковой нет прямого метода для этого, но вы можете использовать метод Apache Commons CollectionUtils.countMatches() и передать NullPredicate экземпляр NullPredicate. Конечно, вы должны передать значения на карте с помощью метода Map#values():

public static <K, V> boolean hasAllNullValues(Map<K, V> map) {
    int size = map.size();
    return CollectionUtils.countMatches(map.values(), NullPredicate.INSTANCE) == size;
}

или даже лучше, используйте метод CollectionUtils.exists(), чтобы проверить, есть ли хотя бы один элемент, который удовлетворяет NotNullPredicate переданному как второй аргумент:

public static <K, V> boolean hasAllNullValues(Map<K, V> map) {
    return !CollectionUtils.exists(map.values(), NotNullPredicate.INSTANCE);
}
4

Другое решение без использования сторонних библиотек.

Collections.frequency(aMap.values(), null) == aMap.size()
2

как насчет

return CollectionUtils.find(aMap.values(),NotNullPredicate.INSTANCE).isEmpty();
  • 0
    Выглядит эквивалентно ответу Рохита.
  • 0
    Да, но это лучше вернуть! CollectionUtils.exists (map.values (), NotNullPredicate.INSTANCE);
2

Для этого нет встроенного метода. В частности, нет ничего, что обеспечивало бы средство "найти элемент, который не равен чему-то".

Однако, если карта, содержащая только null значения, определяется вашими бизнес-правилами как "пустые", это означает, что null значения означают "нет", и в этом случае вы можете построить код таким образом, чтобы null значения никогда не добавляли в первую очередь. Тогда вы можете просто использовать встроенный isEmpty().

1

Нет API, который даст вам это, однако вы можете немного оптимизировать этот метод.
Нет необходимости проверять переменную isEmpty на каждой итерации. Это небольшая оптимизация.

/* Checks if all values are null */
public static <K,V> boolean isMapEmpty(Map<K,V> aMap){
    for (V v: aMap.values()) {
      if (v != null) { return false; }
    }
    return true;
}
  • 0
    @Jason typpo - должен быть aMap.values (); Оптимизация заключается в том, что он не нуждается в дополнительной переменной и дополнительной проверке на каждой итерации ... что складывается.
  • 0
    эй, для чего понижатель? просто хочу помочь парню
Показать ещё 6 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню