Рубрики
Без рубрики

Руководство по классу StringUtils Apache Commons на Java

В этом руководстве мы рассмотрим важные функциональные возможности класса Apache Commons StringUtils на Java с учебными пособиями и примерами всего, что вам нужно знать.

Автор оригинала: Branko Ilic.

Вступление

Библиотека Apache Commons предоставляет множество новых интерфейсов, реализаций и классов, расширяющих базовую платформу Java. Это одна из лучших сторонних библиотек, которая присутствует во многих проектах.

В этой статье мы собрали Руководство по классу StringUtils Apache Commons , в котором представлены некоторые очень хорошие утилиты и инструменты для работы со строками , расширяющие функциональность основного класса – java.lang.Строка .

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

Зачем использовать StringUtils вместо строковых методов?

Многие методы в классе StringUtils имеют свои эквиваленты в java.lang.Строка , но те, которые найдены в StringUtils , являются безопасными для нуля . Это означает, что Исключение NullPointerException не выбрасывается в случаях, когда вы этого не ожидаете.

Как упоминалось ранее, Apache Commons содержит ряд методов, и мы рассмотрим некоторые из наиболее часто используемых:

  • StringUtils.isEmpty() и StringUtils.isBlank()
  • StringUtils.равно()
  • StringUtils.сравните()
  • StringUtils.indexOf()
  • СтрингУтилы.lastIndexOf()
  • StringUtils.содержит()
  • StringUtils.containsIgnoreCase()
  • StringUtils.содержит много()
  • StringUtils.содержит один()
  • StringUtils.содержит только()
  • StringUtils.подстрока()
  • StringUtils.сплит()
  • StringUtils.присоединяйтесь()
  • StringUtils.удалить()
  • StringUtils.заменить()
  • StringUtils.количество совпадений()

Начало работы с Apache Commons

Чтобы иметь возможность использовать библиотеку Apache Commons, нам сначала нужно импортировать ее в наш проект.

Если вы используете Maven, импортируйте последнюю зависимость в свой pom.xml файл:


    org.apache.commons
    commons-lang3
    3.11

В качестве альтернативы, если вы используете Gradle:

compile group: 'org.apache.commons', name: 'commons-lang3', version: '3.11'

С зависимостью commons-lang3 в нашем проекте мы можем перейти к обсуждению некоторых наиболее часто используемых методов из StringUtils . Давайте начнем!

Сравнение строк с Apache Commons

Сравнение строк, проверка того, являются ли они пустыми или пустыми, или просто проверка их равенства-довольно распространенные операции.

Давайте начнем с некоторых методов, связанных с сравнением.

StringUtils.isEmpty() и StringUtils.isBlank()

Эти два метода довольно понятны сами по себе – они оба используются для проверки того, содержит ли строка какой-либо текст. Оба они возвращают true , если строка | действительно пуста. Кроме того, isBlank() также вернет true , если Строка содержит только пробелы.

У них также есть свои обратные методы: Не пусто() и Не пусто() .

Давайте посмотрим, как мы можем использовать isEmpty() вместе с его аналогом java.lang.Строка.isEmpty() , а также isBlank() :

String nullString = null;
String emptyString = "";
String blankString = "\n \t   \n";

if(!nullString.isEmpty()) {
    System.out.println("nullString isn't null");
}

if(StringUtils.isEmpty(emptyString)) {
    System.out.println("emptyString is empty");
}

if(StringUtils.isBlank(blankString)) {
    System.out.println("blankString is blank");
}

У нас здесь три Ниточки. Один указывает на null , второй не является нулевым, но не содержит никакого содержимого (он пустой ), а третий не пуст, но при печати выдаст пустой результат.

Выполнение этого кода приводит к:

Exception in thread "main" java.lang.NullPointerException

Метод isEmpty() , встроенный в java.lang.Строка небезопасна для null. Это вызовет исключение NullPointerException , если вы попытаетесь проверить, пусто ли оно, так как вы вызываете метод по ссылке null . Вам нужно будет заранее проверить, является ли ссылка нулевой:

String nullString = null;
String emptyString = "";
String blankString = "\n \t   \n";

if(nullString != null && !nullString.isEmpty()) {
    System.out.println("nullString isn't null");
}

if(StringUtils.isEmpty(emptyString)) {
    System.out.println("emptyString is empty");
}

if(StringUtils.isBlank(blankString)) {
    System.out.println("blankString is blank");
}

Теперь это приводит к:

emptyString is empty
blankString is blank

И если мы протестируем эти методы на нулевой строке :

if(StringUtils.isEmpty(nullString)) {
    System.out.println("emptyString is empty");
}

if(StringUtils.isBlank(nullString)) {
    System.out.println("blankString is blank");
}

Это приводит к:

emptyString is empty
blankString is blank

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

StringUtils.равно()

Этот метод делает именно то , что вы думаете – сравнивает две строки и возвращает true , если они идентичны или обе ссылки указывают на null , но имейте в виду, что этот метод чувствителен к регистру .

Давайте посмотрим, как работает этот метод:

System.out.println(StringUtils.equals(null, null));
System.out.println(StringUtils.equals(null, "some string"));
System.out.println(StringUtils.equals("some string", null));
System.out.println(StringUtils.equals("some string", "some string"));
System.out.println(StringUtils.equals("some other string", "some string"));

Это выведет:

true
false
false
true
false

Для сравнения метода equals() из StringUtils с java.lang.String.equals() , давайте проверим их:

String nullString = null;

System.out.println(StringUtils.equals(nullString, null));
System.out.println(StringUtils.equals(nullString, "string"));

System.out.println(nullString.equals(null));
System.out.println(nullString.equals("string"));

Это приводит к:

true
false
Exception in thread "main" java.lang.NullPointerException

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

StringUtils.сравните()

Объявление этого метода выглядит следующим образом:

public static int compare(CharSequence str1, CharSequence str2)

Этот метод сравнивает два String s лексикографически, так же, как java.lang.String.compareTo() делает, возвращая:

  • 0 если str1 равно str2 (или оба равны нулю )
  • Значение меньше, чем 0 если str1 меньше, чем str2
  • Значение, большее, чем 0 если str1 больше, чем str2

В этой статье мы не будем обсуждать, что именно | лексикографически означает сравнение двух Строк , поэтому, если вам интересно прочитать об этом подробнее, проверьте эту ссылку.

Теперь давайте посмотрим, как мы можем использовать его в нашей программе:

System.out.println(StringUtils.compare(null, null));
System.out.println(StringUtils.compare(null , "a"));
System.out.println(StringUtils.compare("a", null));
System.out.println(StringUtils.compare("a", "A"));
System.out.println(StringUtils.compare("a", "a"));

Это, в свою очередь, приведет к:

0
-1
1
32
0

Примечание: значение null считается меньшим, чем значение, отличное от null . Два значения null считаются равными.

Индексирование поисковых последовательностей с помощью Apache Commons

Теперь давайте взглянем на группу методов, которые имеют дело с проверками индексов, конечно, безопасным нулевым/| способом. Все эти методы имеют несколько перегруженных вариантов, но наиболее общими из них являются:

public static int indexOf(CharSequence seq, CharSequence searchSeq)
public static int lastIndexOf(CharSequence seq, CharSequence searchSeq)
public static boolean contains(CharSequence seq, CharSequence searchSeq)

У всех них есть одна общая черта: все они используют свои не/| нулевые безопасные варианты из java.lang.Строка , если это возможно сделать. Давайте объясним это немного подробнее.

StringUtils.indexOf()

Этот метод, так же как и встроенный, будет искать индекс первого появления последовательности в другой последовательности. Если встроенный java.lang.String.indexOf() метод не создает Исключение NullPointerException , оно будет использовано. Если нет, то реализация Apache Commons берет верх.

Возвращаемое значение-это первый найденный индекс, или -1 если либо совпадения нет, либо входная строка равна нулю .

Давайте сейчас напишем какой-нибудь код:

String s = "Java is a general-purpose programming language";

System.out.println(StringUtils.indexOf(null, "a"));
System.out.println(StringUtils.indexOf(s, "general"));
System.out.println(StringUtils.indexOf(s, "l"));
System.out.println(StringUtils.indexOf(s, "lan"));

Выполнение приведенного выше кода приведет к следующему результату:

-1
10
16
38

СтрингУтилы.lastIndexOf()

Метод lastIndexOf() работает почти так же, как индекс() работает, но он возвращает последнее вхождение, а не первое в последовательности поиска.

Давайте запустим тот же код, что и раньше:

String s = "Java is a general-purpose programming language";

System.out.println(StringUtils.lastIndexOf(null, "a"));
System.out.println(StringUtils.lastIndexOf(s, "general"));
System.out.println(StringUtils.lastIndexOf(s, "l"));
System.out.println(StringUtils.lastIndexOf(s, "lan"));

Выполнение приведенного выше кода приведет к следующему результату:

-1
10
38
38

Проверьте, содержит ли строка другую строку с Apache Commons

StringUtils.содержит()

Git Essentials

Ознакомьтесь с этим практическим руководством по изучению Git, содержащим лучшие практики и принятые в отрасли стандарты. Прекратите гуглить команды Git и на самом деле изучите это!

Метод contains() возвращает true или false в зависимости от того, содержится ли последовательность поиска в другой последовательности или нет.

В случае успеха этот метод также использует java.lang.Строка.Индекс(Строка) . В случае null в качестве входных данных возвращается false :

String s = "Java is a general-purpose programming language";

System.out.println(StringUtils.contains(null, "a"));
System.out.println(StringUtils.contains(s, "Java"));
System.out.println(StringUtils.contains(s, "Python"));
System.out.println(StringUtils.contains(s, "pRoGrAmMinG"));

Метод, конечно, чувствителен к регистру, поэтому последний вызов также вернет false :

false
true
false
false

StringUtils.containsIgnoreCase()

Метод containsIgnoreCase() работает так же, как метод contains () , но не учитывает регистр:

String s = "Java is a general-purpose programming language";

System.out.println(StringUtils.containsIgnoreCase(null, "a"));
System.out.println(StringUtils.containsIgnoreCase(s, "Java"));
System.out.println(StringUtils.containsIgnoreCase(s, "Python"));
System.out.println(StringUtils.containsIgnoreCase(s, "pRoGrAmMinG"));

Это приводит к:

false
true
false
true

StringUtils.содержит много()

содержит любой() метод, проверка которого принимает vararg, кроме строки, в которой мы ищем. Он возвращает true , если искомая последовательность содержит какие-либо элементы из vararg:

String s = "Java is a general-purpose programming language";

System.out.println(StringUtils.containsAny(s, "general", "python", "something", "javascript"));

Это приводит к:

true

Этот метод также чувствителен к регистру, поэтому обязательно имейте это в виду.

StringUtils.содержит один()

Вместо того, чтобы создавать крайние случаи с помощью предыдущего метода, вы можете просто использовать не содержит () , если вы хотите убедиться, что строка не содержит ни одного из элементов, которые вы ввели в качестве vararg:

String s = "Java is a general-purpose programming language";

System.out.println(StringUtils.containsNone(s, "general", "python", "something", "javascript"));

Это приводит к:

false

StringUtils.содержит только()

Или, если вы хотите проверить, содержит ли строка только заданное вами содержимое, вы можете использовать метод содержит только() :

String s = "Java";

System.out.println(StringUtils.containsOnly(s, "Java"));

Это приводит к:

true

Методы подстроки Apache Commons

StringUtils.подстрока()

Среди многих доступных перегруженных вариантов этого метода мы обсудим два из них:

  1. подстрока(строка str, начало int)
  2. подстрока(строка str, начало int, конец int)

Этот метод возвращает подстроку , начинающуюся с начала и переходящую в конец Строки или конец индекса.

Мы также можем использовать отрицательное число для параметра start , что даст нам подстроку, которая начинается n символов с конца Строки .

Если есть ввод null , возвращаемое значение будет просто null .

Давайте посмотрим, как мы можем его использовать:

System.out.println(StringUtils.substring("a random string", 4, 8));
System.out.println(StringUtils.substring("a random string", -7));
System.out.println(StringUtils.substring(null, 5));

Выполнение приведенного выше кода дает нам:

ndom
 string
null

StringUtils.сплит()

При наличии Строки и символа-разделителя этот метод разделит Строку и поместит ее в массив.

Элементами результирующего массива являются подстроки, разделенные разделителями в исходной Строке . Разделитель не включается в окончательный массив после разделения.

Как и в случае с другими методами в StringUtils , он возвращает null , если входные данные null .

Давайте рассмотрим некоторый код и то, как работает этот метод:

String csvString = "Id, Name, Age, Location";
    	
System.out.println(Arrays.toString(StringUtils.split(csvString, ',')));
System.out.println(Arrays.toString(StringUtils.split(null, '.')));
System.out.println(Arrays.toString(StringUtils.split("", '.')));

После запуска кода мы получаем:

[Id,  Name,  Age,  Location]
null
[]

StringUtils.присоединяйтесь()

Этот метод представляет собой прямую противоположность методу split () .

После разделения Строки символом-разделителем мы можем так же легко соединить ее с помощью метода join () , предоставив список или массив элементов. Он возвращает Строку , созданную путем склеивания предоставленных элементов вместе с помощью разделителя. Если входные данные null , метод возвращает null .

Давайте рассмотрим этот простой пример:

String csvString = "Id, Name, Age, Location";
    	
String[] myStr =  StringUtils.split(csvString, ',');
System.out.println(StringUtils.join(myStr, ';'));

Выполнение приведенного выше кода дает нам:

Id; Name; Age; Location

StringUtils.удалить()

Есть два варианта этого метода, которые мы хотим рассмотреть:

public static String remove(String str, char remove)
public static String remove(String str, String remove)

Они оба делают одно и то же, за исключением того , что второй удаляет каждое вхождение подстроки , в то время как первый удаляет каждое вхождение символа из данной Строки | str .

Если входные данные null , метод возвращает null .

Для этого мы разделим примеры на два отдельных блока кода, потому что их может быть немного сложно различить на основе первого взгляда. Давайте начнем с удалить(строка str, символ удалить) :

System.out.println(StringUtils.remove(null, 'a'));
System.out.println(StringUtils.remove("", 'a'));
System.out.println(StringUtils.remove("queued", 'u'));

System.out.println(StringUtils.remove(null, "abc"));
System.out.println(StringUtils.remove("", "abc"));
System.out.println(StringUtils.remove("abc", null));
System.out.println(StringUtils.remove("queued", "ue"));

Давайте запустим это и посмотрим, что это даст:

null // Returned null
     // Removed 'a' from ""
qeed // Removed 'u' characters
null // Returned null
     // Removed "abc" from ""
abc  // Removed null from "abc"
qd   // Removed "ue" from "queued"

Здесь мы должны отметить одну вещь, поскольку ее легко упустить из виду: когда параметр remove имеет значение null , возвращается исходная строка.

StringUtils.заменить()

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

Объявление этого метода выглядит следующим образом:

public static String replace(String text, String searchString, String replacement)

Если строка поиска не найдена в тексте , ничего не произойдет, и ваш текст останется прежним. Следуя той же логике, если текст равен null , этот метод возвращает null .

Если какая-либо из поисковой строки или замены имеет значение null , метод возвращает свой источник, то есть текст .

Давайте попробуем этот метод:

String string = "a simple sentence";
System.out.println(StringUtils.replace(string, "simple", "complicated"));

Это приведет к:

a complicated sentence

StringUtils.количество совпадений()

функция подсчета совпадений() подсчитывает, сколько раз указанный символ (или подстрока) появляется в данной строке. A null или пустой ввод возвращает 0 .

Давайте посмотрим, как это работает в коде:

String string = "I'm blue Da ba dee da ba di, Da ba dee da ba di";

System.out.println(StringUtils.countMatches(null, 'd'));
System.out.println(StringUtils.countMatches(string, 'd'));

System.out.println(StringUtils.countMatches(null, "da"));
System.out.println(StringUtils.countMatches(string, "da"));

Выполнение приведенного выше кода дает нам:

0
6
0
2

Вывод

В этой статье мы рассмотрели некоторые из наиболее часто используемых и известных методов в классе Apache Commons StringUtils .

Методы, найденные в классе StringUtils , безопасны для нуля и обеспечивают базовую, а также расширенную функциональность встроенных строковых методов.