Лучший способ проверить, что строка пуста или равна нулю

я уверен, что это, должно быть, спрашивали раньше по-разному - поскольку 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) или Guava (Strings.isNullOrEmpty) или любой другой вариант?


person prash    schedule 14.09.2015    source источник
comment
inputString!=null && inputString.isEmpty(); более совершенный inputString!=null && inputString.trim().isEmpty();   -  person StackFlowed    schedule 14.09.2015
comment
Вы также можете использовать утилиты Apache String isEmpty() выполняет проверку нулевого значения, а также проверку пробелов.   -  person StackFlowed    schedule 14.09.2015
comment
isEmpty является новым в java 6, и реализации, которые старше или хотят оставаться совместимыми с java 5, должны будут использовать проверку длины.   -  person zapl    schedule 14.09.2015
comment
Если вы делаете return inputString==null || inputString.length()==0 || inputString.trim().length()==0; (объединение 1 и 2), то обрезка вызывается только для строки ненулевой длины. Вы также можете добавить 3 к нему.,   -  person Christian Fries    schedule 14.09.2015
comment
@ChristianFries Да, я согласен - один и тот же подход можно использовать как для trim(), так и для сопоставления с образцом. Но позвольте мне спросить так: trim() или matcher(), что дороже?   -  person prash    schedule 14.09.2015
comment
У Guava есть Strings.isNullOrEmpty(), который я сейчас использую больше всего!   -  person prash    schedule 25.10.2016
comment
Возможный дубликат Проверьте, не является ли строка нулевой и не пустой   -  person Durgpal Singh    schedule 26.03.2019


Ответы (14)


Не видел полностью нативных решений, так что вот одно из них:

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")
person gzak    schedule 18.05.2019

Полезный метод от Apache Commons:

 org.apache.commons.lang.StringUtils.isBlank(String str)

https://commons.apache.org/proper/commons-lang/javadocs/api-2.6/org/apache/commons/lang/StringUtils.html#isBlank(java.lang.String)

person puczo    schedule 14.09.2015
comment
У Guava есть Strings.isNullOrEmpty(), который я использую довольно часто в наши дни. - person prash; 25.10.2016
comment
isNullOrEmpty не проверяет случай, когда входная строка состоит из нескольких пробелов - person Manav Bhanot; 07.05.2019

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

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)){...}

person GregH    schedule 14.09.2015
comment
обновлено спасибо. Я неизбежно делаю эту ошибку каждый раз, а затем компилирую ее, вижу ошибку и понимаю, что совершил эту ошибку в 9-миллиардный раз :) - person GregH; 14.09.2015
comment
@zapl или оператор в java - это короткое замыкание. Он сломается, если myString имеет значение null - person James Wierzba; 14.09.2015
comment
Ответ @JamesWierzba был if (s.isEmpty||s==null), что делает короткое замыкание с NPE в случае нуля :) удаленный комментарий, чтобы избежать путаницы. - person zapl; 14.09.2015
comment
И он не заботится о пробелах :) - person prash; 05.01.2018
comment
В вопросе упоминалось только значение null или пусто. Если также необходимо обнаружить пробелы, это можно легко изменить на if(myString==null || myString.trim().isEmpty()){...}. - person GregH; 07.03.2018
comment
Строка теперь имеет метод .isBlank() - person user2303325; 11.04.2019

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

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

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

person Joop Eggen    schedule 14.09.2015
comment
Спасибо, Джуп, я думаю, что это также чистое решение - оно не будет работать для пустых строк с несколькими пробелами, таких как . - person prash; 14.09.2015
comment
@prash: добавлена ​​​​обрезка для хорошего порядка, но apache commons непобедим. ;) - person Joop Eggen; 14.09.2015
comment
Должен сказать, я думаю, что использование Optional заражает сообщество Java, как тяжелая болезнь. Я никогда раньше не видел, чтобы функция, для достижения которой требуется столько дополнительного набора текста, была настолько простой, но принята таким большим количеством овец в то время, когда конкурирующие языки стремятся к более кратким решениям. Должно быть, разработчики, не работающие с Java, смеются над нами. Я даже не упомянул о дополнительном потреблении ЦП и памяти, когда экземпляры OptionalS возвращаются методами, которые вызываются миллионы раз в секунду, но все это выполняется в облаке, поэтому ЦП и память почти свободны, верно? - person Volksman; 03.02.2019
comment
@Volksman Я согласен с тем, что 1. некоторые другие языки имеют лучшие (разработанные) конструкции, 2. Необязательный - это позднее добавление, артефакт с незрелым API. Но это 1. лучше, чем null, 2. позволяет выполнять некоторые приятные операции в стиле карты. - person Joop Eggen; 04.02.2019
comment
@JoopEggen Я использую полиморфные классы/объекты Null со времен C++ для хранения элементов в шаблонных/общих коллекциях, которые представляют null, но недавно я работал в крупномасштабных системах, которые уже имеют проблемы с производительностью (ЦП + память), обрабатывая тысячи транзакций в секунду. Если мы изменим рабочий код, возвращающий null, заключив каждое возвращаемое значение в необязательный, мы будем каждую секунду выделять тысячи новых объектов в куче, заставляя борющуюся систему выполнять больше работы без пользы (ИМХО) и много боли или увеличения расходы на инфраструктуру, чтобы справиться. Хотя концептуально круто! - person Volksman; 05.02.2019
comment
@Volksman 100% правда; также продуктивны волны небольших рефакторингов (хотя нужно проводить рефакторинг во время разработки, чтобы сохранить код в порядке). Производительность может удивить, но она действительно не оптимальна. - person Joop Eggen; 05.02.2019

Этот из 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'
}
person mavis.chen    schedule 11.11.2016
comment
Не могли бы вы указать, из какой библиотеки вы используете класс Strings? - person Silver Quettier; 06.12.2016
comment
Из Google Гуава. Я отредактировал ответ с помощью библиотеки. - person mavis.chen; 08.12.2016
comment
Размер зависимости Guava: 2,3 МБ только для проверки того, является ли строка нулевой или пустой... В Guava отсутствует модульность. - person Aure77; 08.08.2017

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

person Evgeniy Dorofeev    schedule 14.09.2015

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

f(StringUtils.isEmpty(str)) {
    //.... String is blank or null
}
person gifpif    schedule 19.03.2019
comment
Начиная с Spring 5.3 isEmpty устарел. Вместо этого рекомендуется использовать следующие альтернативы: hasLength(String), hasText(String) or ObjectUtils.isEmpty(Object) - person Mihkel Selgal; 23.03.2021

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

OR

TextUtils.isNotBlank(label);

последнее решение проверит, не является ли оно нулевым, и одновременно обрежет строку

person haneenCo    schedule 02.08.2017
comment
TextUtils от apache httpcore. - person arulraj.net; 04.09.2018

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

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

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

person Adarsh Thimmappa    schedule 15.02.2018

С openJDK 11 вы можете использовать внутреннюю проверку, чтобы проверить, является ли строка нулевой или просто пробелами.

import jdk.internal.joptsimple.internal.Strings;
...

String targetString;
if (Strings.isNullOrEmpty(tragetString)) {}
person sachyy    schedule 18.03.2020

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

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

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

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

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

person Deepak Pandey    schedule 26.03.2019

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

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") в общей форме.

person rsa    schedule 23.05.2019
comment
технически это хороший ответ, но с точки зрения производительности он может быть не лучшим - person prash; 24.05.2019
comment
Похоже на соревнование ))) Кто дольше реализует! - person 4ndrew; 04.10.2019

Мы можем использовать ниже

Optional.ofNullable(result).filter(res -> StringUtils.isNotEmpty(res))
            .ifPresent( s-> val.set(s));
person naveen reddy    schedule 14.05.2021