Способ проверить, является ли Коллекция или Карта пустой или нулевой? - PullRequest
0 голосов
/ 17 октября 2018

Я хочу проверить, является ли карта, HashMap, ArrayList, List или что-либо из коллекций пустым или пустым?

У меня есть это, но оно не работает, когда я передаю карту:

protected static <T extends Collection, Map> boolean isCollectionMapNullOrEmpty(final T c) {
  if (c == null) {
      return true;
  }

  return c.isEmpty();
 }

Ошибка:

  List<String> aList = Arrays.asList("a1", "a2", "a4");
  Map<String, Object> aMap = new HashMap<String, Object>();
  aMap.put("a2", "foo");
  aMap.put("a1", "foo");
  aMap.put("a3", "foo");
  aMap.put("a4", "foo");
  System.out.println(isCollectionMapNullOrEmpty(aList));  // works

  // fails with The method isCollectionMapNullOrEmpty(T) in the type LearnHashMap is not applicable for the arguments (Map<String,Object>)
  System.out.println(isCollectionMapNullOrEmpty(aMap));

Ответы [ 3 ]

0 голосов
/ 17 октября 2018

Apache Collections предоставляет статический метод, который делает это.Есть ли причина, по которой вы пишете свою собственную реализацию?

0 голосов
/ 14 августа 2019

У вас есть метод ( ссылка ):

boolean org.apache.commons.collections.CollectionUtils.isEmpty (Collection coll)

имеет нулевую проверку, если указанная коллекция пуста.Таким образом, вам не нужно проверять нулевые значения или определять пользовательские методы

0 голосов
/ 17 октября 2018

Ваш isCollectionMapNullOrEmpty компилируется и работает, но не так, как вы хотели.

<T extends Collection, Map>

Вы объявили две переменные типа, T и Map, где T должно бытьCollection.Переменная типа Map не имеет ничего общего с интерфейсом Map и фактически даже не используется.(Кроме того, вы использовали здесь интерфейс Collection.) Вы передаете aList, который является Collection, поэтому он компилируется.Однако aMap не является Collection, поэтому компиляция не может передать Map.

Похоже, вы хотели, чтобы T был либо Collection , либо a Map.Но дженерики Java не работают таким образом;Вы не можете объявить параметр типа как одну вещь или другую вещь.

(Кроме того, вы можете сказать одну вещь и другую вещь: T extends Collection & Map или без необработанных типов, T extends Collection<?> & Map<?, ?>, но я не знаю ни одного класса, реализующего оба интерфейса.)

Вы можете иметь два перегруженных метода, один для Collection и один для Map, который будет выполнять те же функции.Здесь я воспользовался коротким замыканием, чтобы объединить операторы:

protected static boolean isCollectionMapNullOrEmpty(final Collection<?> c) {
    return c == null || c.isEmpty();
}
protected static boolean isCollectionMapNullOrEmpty(final Map<?, ?> m) {
    return m == null || m.isEmpty();
}

Оба метода имеют один и тот же точный код, но поскольку нет суперинтерфейса, объявляющего isEmpty, похоже, чтотак хорошо, как только может.

...