Как определить, содержит ли список строк нулевые или пустые элементы

В Java у меня есть следующий метод:

public String normalizeList(List<String> keys) {
    // ...
}

Я хочу проверить, что keys:

  • Не сам null; и
  • Не пуст (size() == 0); и
  • Не имеет элементов String, которые null; и
  • Не существует элементов String, которые пусты ("")

Это полезный метод, который будет использоваться в "обычном" стиле JAR (класс wil будет чем-то вроде DataUtils). Вот что у меня есть, но я считаю, что это неверно:

public String normalize(List<String> keys) {
    if(keys == null || keys.size() == 0 || keys.contains(null) || keys.contains(""))
        throw new IllegalArgumentException("Bad!");

    // Rest of method...
}

Я считаю, что последние 2 проверки для keys.contains(null) и keys.contains("") являются неправильными и, скорее всего, будут вызывать исключения во время выполнения. Я знаю, что могу просто прокрутить список внутри оператора if и проверить там nulls/empties, но я ищу более элегантное решение, если оно существует.

Ответ 1

 keys.contains(null) || keys.contains("")

Не генерирует исключений и результатов выполнения во время выполнения true, если ваш список имеет либо нулевую (или) пустую строку.

Ответ 2

Это выглядит хорошо для меня, единственными исключениями, которые вы получили бы от keys.contains(null) и keys.contains(""), было бы, если keys сам был null.

Однако, поскольку вы сначала проверяете это, вы знаете, что на данный момент keys не null, поэтому исключений во время выполнения не будет.

Ответ 3

Я не уверен, но нет ли в этом классе вспомогательного класса в библиотеке ApacheCommon? например, когда у вас есть isEmpty для строки, и у вас есть isNullOrEmpty в библиотеке ApacheCommons

Ответ 4

Проверить список за один проход

  public static boolean empty(String s) {
    if (s == null)
      return true;
    else if (s.length() == 0)
      return true;
    return false;
  }  

  public String normalize(List<String> keys) {
    if(keys == null || keys.size() == 0)
        throw new IllegalArgumentException("Bad!");
    for (String key: keys)
      if(empty(key))
         throw new IllegalArgumentException("Empty!");

    // Rest of method...
    return null;
  }

Ответ 5

Вы также можете использовать Apache StringUtils и проверить, является ли строкаBlank, это будет проверять значение null, Emptystring и также обрезает ваше значение.

if(StringUtils.isBlank(listItemString)){...}

Оформить заказ StringUtils Docs здесь:

https://commons.apache.org/proper/commons-lang/apidocs/org/apache/commons/lang3/StringUtils.html

Ответ 6

С Java 8 вы можете сделать:

public String normalizeList(List<String> keys) {
    boolean bad = keys.stream().anyMatch(s -> (s == null || s.equals("")));
    if(bad) {
        //... do whatever you want to do
    }
}