Мне нужно проверить, являются ли все значения на карте нулевыми, у меня есть этот метод, который я хочу заменить встроенным, если это возможно. Ограничения: 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;
}
Как таковой нет прямого метода для этого, но вы можете использовать метод 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);
}
Другое решение без использования сторонних библиотек.
Collections.frequency(aMap.values(), null) == aMap.size()
как насчет
return CollectionUtils.find(aMap.values(),NotNullPredicate.INSTANCE).isEmpty();
Для этого нет встроенного метода. В частности, нет ничего, что обеспечивало бы средство "найти элемент, который не равен чему-то".
Однако, если карта, содержащая только null
значения, определяется вашими бизнес-правилами как "пустые", это означает, что null
значения означают "нет", и в этом случае вы можете построить код таким образом, чтобы null
значения никогда не добавляли в первую очередь. Тогда вы можете просто использовать встроенный isEmpty()
.
Нет 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;
}