Лучший способ проверить строку пуст или null

я уверен, что раньше об этом спрашивали по-разному - поскольку isEmptyOrNull настолько распространен, что люди реализуют его по-разному. но у меня ниже любопытный запрос с точки зрения наилучшего доступного подхода, который хорош как для памяти, так и для производительности.

1) Ниже не учитываются все пробелы, как в случае пустого тега XML

return inputString==null || inputString.length()==0;

2) Внизу позаботьтесь, но триммер может съесть немного производительности + память

return inputString==null || inputString.trim().length()==0;

3) Объединение одного и двух может сэкономить некоторую производительность + память (как предложил Крис в комментариях)

return inputString==null || inputString.trim().length()==0 || inputString.trim().length()==0;

4) Преобразовано в сопоставление с шаблоном (вызывается только в том случае, если строка имеет ненулевую длину)

private static final Pattern p = Pattern.compile("\\s+");

return inputString==null || inputString.length()==0 || p.matcher(inputString).matches();

5) Использование таких библиотек, как -     Apache Commons (StringUtils.isBlank/isEmpty)     или spring (StringUtils.isEmpty)     или гуава (Strings.isNullOrEmpty)     или любой другой вариант?

Ответы

Ответ 2

Чтобы определить, является ли строка нулевой или пустой, вы можете использовать следующее, не включая какие-либо внешние зависимости от вашего проекта и сохраняя ваш код простым/чистым:

if(myString==null || myString.isEmpty()){
    //do something
}

или если также необходимо обнаружить пробелы:

if(myString==null || myString.trim().isEmpty()){
    //do something
}

Вы можете легко обернуть их в служебные методы, чтобы быть более краткими, поскольку это очень распространенные проверки:

public final class StringUtils{

    private StringUtils() { }   

    public static bool isNullOrEmpty(string s){
        if(s==null || s.isEmpty()){
            return true;
        }
        return false;
    }

    public static bool isNullOrWhiteSpace(string s){
        if(s==null || s.trim().isEmpty()){
            return true;
        }
        return false;
    }
}

а затем вызвать эти методы через:

if(StringUtils.isNullOrEmpty(myString)){...}

а также

if(StringUtils.isNullOrWhiteSpace(myString)){...}

Ответ 3

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

String s = Optional.ofNullable(myString).orElse("");
if (s.trim().isEmpty()) {
    ...
}

Имеет смысл, если вы можете использовать Optional<String>.

Ответ 4

Этот один из Google Guava может проверять "пустую и пустую строку" в одно и то же время.

Strings.isNullOrEmpty("Your string.");

Добавить зависимость с Maven

<dependency>
  <groupId>com.google.guava</groupId>
  <artifactId>guava</artifactId>
  <version>20.0</version>
</dependency>

с Грейдлом

dependencies {
  compile 'com.google.guava:guava:20.0'
}

Ответ 5

Apache Commons Lang имеет StringUtils.isEmpty(String str) который возвращает true, если аргумент пуст или null

Ответ 6

Optional.ofNullable(label)
.map(String::trim)
.map(string -> !label.isEmpty)
.orElse(false)

ИЛИ

TextUtils.isNotBlank(label);

последнее решение будет проверять, если не null и триммировать str в одно и то же время

Ответ 7

В большинстве случаев StringUtils.isBlank(str) из библиотеки apache commons будет ее решать. Но если есть случай, когда проверяемая строка ввода имеет нулевое значение в кавычках, он не может проверить такие случаи.

Возьмем пример, когда у меня есть входной объект, который был преобразован в строку с использованием String.valueOf(obj). Если ссылка obj равна null, String.valueOf возвращает "null" вместо null.

Когда вы StringUtils.isBlank("null") использовать, StringUtils.isBlank("null"), API терпит неудачу, вам, возможно, придется также проверять такие варианты использования, чтобы убедиться, что ваша проверка правильна.

Ответ 8

Просто и понятно:

if (str == null || str.trim().length() == 0) {
    // str is empty
}

Ответ 9

библиотека springframework Проверьте, является ли данная строка пустой.

f(StringUtils.isEmpty("")) {
    //.... String is blank or null
}

Ответ 10

Вы можете использовать библиотеку Stringutils для Optional и Apache commons.

Optional.ofNullable(StringUtils.noEmpty(string1)).orElse(string2);

здесь он проверит, не является ли string1 нулевым и не пустым, иначе вернет string2

Ответ 11

Не видел ни одного полностью нативного решения, поэтому вот одно:

return str == null || str.chars().allMatch(Character::isWhitespace);

По сути, используйте встроенную функцию Character.isWhitespace(). Оттуда вы можете достичь разных уровней оптимизации, в зависимости от того, насколько это важно (могу вас заверить, что в 99,99999% случаев использования дополнительная оптимизация не требуется):

return str == null || str.length() == 0 || str.chars().allMatch(Character::isWhitespace);

Или, чтобы быть действительно оптимальным (но черт возьми)

int len;
if (str == null || (len = str.length()) == 0) return true;
for (int i = 0; i < len; i++) {
  if (!Character.isWhitespace(str.charAt(i))) return false;
}
return true;

Одна вещь, которую я люблю делать:

Optional<String> notBlank(String s) {
  return s == null || s.chars().allMatch(Character::isWhitepace))
    ? Optional.empty()
    : Optional.of(s);
}

...

notBlank(myStr).orElse("some default")

Ответ 12

Если вам нужно проверить более одной строки в одной и той же проверке, вы можете сделать что-то вроде этого:

import java.util.Optional;
import java.util.function.Predicate;
import java.util.stream.Stream;

public class StringHelper {

  public static Boolean hasBlank(String ... strings) {

    Predicate<String> isBlank = s -> s == null || s.trim().isEmpty();

    return Optional
      .ofNullable(strings)
      .map(Stream::of)
      .map(stream -> stream.anyMatch(isBlank))
      .orElse(false);
  }

}

Таким образом, вы можете использовать это как StringHelper.hasBlank("Hello", null, "", " ") или StringHelper.hasBlank("Hello") в общей форме.