Java проверяет, что карта имеет требуемый список ключей, и что их значения не являются пустым вложенным списком или картой - PullRequest
0 голосов
/ 13 октября 2018

В Java, как мне убедиться, что на карте есть требуемый список ключей и что их значения не являются пустым вложенным списком или картой

например, хорошая карта

Good Map example:

{"key1": ["a1", "a2"],
 "key2": {"x": "y"}}


{"key1": {"x": "y"},
 "key2": ["a1", "a2"]}

Я хочу сделатьубедитесь, что на приведенной выше карте требуются ключи key1 и key2 со значениями непустого списка / карты

например, плохая карта

Good Map example:

{"key2": {"x": "y"}}


{"key1": {},
 "key2": []}

{"key1": "badValue", "key2": "badValue"}

Ответы [ 2 ]

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

Я думаю, что нашел это:

Простая функция:

public static boolean isObjectNullOrEmpty( final Object c ) {
  if (c == null) {
    return true;
  }

   if (c instanceof Collection<?>) {
     Collection<?> col = (Collection<?>)c;
     return col.isEmpty();
  }
   if (c instanceof Map<?, ?>) {
     Map<?, ?> map = (Map<?, ?>)c;
     return map.isEmpty();
  }
   return false;
}

Использование:

  // check if a map contains required keys and those required keys have values as Collection which are not empty
  Map<String, Object> map = new HashMap<>();
  Map<String, Object> nestedMap1 = new HashMap<String, Object>() {{
    put("state", "UP");
  }};
  map.put("key1", nestedMap1);
  map.put("key2", new HashMap<>());

  List<String> requiredKeys = Arrays.asList("key1");
  System.out.println(map.get("key1"));
  Boolean mapContainsEmptyStuff = requiredKeys.stream().anyMatch(
      key -> isObjectNullOrEmpty(map.get(key))
      );
  assert mapContainsEmptyStuff == false;
  System.out.println(String.format("mapContainsEmptyStuff: '%s': %s", map, mapContainsEmptyStuff));

  requiredKeys = Arrays.asList("key1", "key2");
  mapContainsEmptyStuff = requiredKeys.stream().anyMatch(
      key -> isObjectNullOrEmpty(map.get(key))
      );
  assert mapContainsEmptyStuff == true;
  System.out.println(String.format("mapContainsEmptyStuff: '%s': %s", map, mapContainsEmptyStuff));

  requiredKeys = Arrays.asList("key1");
  HashMap<String, String> map1 = new HashMap<String, String>() {{
    put("key1", "badValue");
  }};
  mapContainsEmptyStuff = requiredKeys.stream().anyMatch(
      key -> isObjectNullOrEmpty(map.get(key))
      );
  assert mapContainsEmptyStuff == true;
  System.out.println(String.format("mapContainsEmptyStuff: '%s': %s", map, mapContainsEmptyStuff));
0 голосов
/ 13 октября 2018

Я бы смоделировал это как метод, который возвращает true, когда все ключи присутствуют и действительны, и false в противном случае.Я бы обозначил требуемые ключи как Collection<String>, чтобы можно было легко перебирать их.

Collection<String> keys = Arrays.asList("key1", "key2");

Затем я бы повторил цикл и проверил, что каждый ключ присутствует и действителен:

public static boolean isValidMap(Map<String, Object> map, Collection<String> keys) {
    for (String key : keys) {
        Object value = map.get(key);

        if (isInvalid(value)) {
            return false;
        }
    }

    return true;
}

Последняя часть определяет, является ли данный объект недействительным:

public static boolean isInvalid(Object o) {
    if (o == null) {
        return true;
    }

    if (o instanceof Collection) {
        return ((Collection) o).isEmpty();
    }

    return true;
}

Конечно, вы можете настроить метод isInvalid() для любого поведения, которое вам требуется.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...