JavaRush /Курсы /JSP & Servlets /Класс StringUtils из Apache Commons

Класс StringUtils из Apache Commons

JSP & Servlets
20 уровень , 2 лекция
Открыта

Знакомство со StringUtils

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

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

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

Список методов StringUtils:

isEmpty() Проверяет, пустая ли строка
equals() Сравнивает строки
compare() Сравнивает строки
indexOf() Поиск подстроки в строке
lastIndexOf() Поиск подстроки в строке
contains() Проверяет вхождение подстроки в строку
containsIgnoreCase() Проверяет вхождение подстроки в строку, игнорируя регистр
containsAny() Проверяет вхождение подстроки в любом месте строки
containsNone() Проверяет, нет ли вхождения подстроки в любом месте строки
containsOnly() Проверяет вхождение подстроки в строку
substring() Получение подстроки
split() Разбиваем строку на подстроки
join() Объединяем подстроки
remove() Удаляем подстроку
replace() Заменить подстроку
countMatches() Считаем количество совпадений

StringUtils.isEmpty() и StringUtils.isBlank()

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

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

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


String nullValue = null;
String emptyValue = "";
String blankValue = "\n \t   \n";

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

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

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

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

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

emptyValue is emptyValue
blankValue is blankValue
Exception in thread "main" java.lang.NullPointerException

Метод isEmpty(), встроенный в java.lang.String, небезопасный для null. Ты легко получишь NullPointerException, если попытаешся проверить, пуста ли она, так как вызовешь метод по ссылке null. Нужно будет заранее проверить, является ли ссылка нулевой:


String nullValue = null;
String emptyValue = "";
String blankValue = "\n \t   \n";

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

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

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

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

emptyValue is emptyValue
blankValue is blankValue

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


String nullValue = null;

if(StringUtils.isEmpty(nullValue)) {
   System.out.println("nullValue is emptyValue");
}

if(StringUtils.isBlank(nullValue)) {
   System.out.println("nullValue is blankValue");
}

То получим:

nullValue is emptyValue
nullValue is blankValue

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

StringUtils.equals()

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

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


System.out.println(StringUtils.equals(null, null));
System.out.println(StringUtils.equals(null, "какая-то информация"));
System.out.println(StringUtils.equals("какая-то информация", null));
System.out.println(StringUtils.equals("какая-то информация",  "какая-то информация"));
System.out.println(StringUtils.equals("какая-то дополнительная информация", "какая-то информация"));

Результат:

true
false
false
true
false

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


String nullValue = null;

System.out.println(StringUtils.equals(nullValue, null));
System.out.println(StringUtils.equals(nullValue, "какая-то информация"));

System.out.println(nullValue.equals(null));
System.out.println(nullValue.equals("какая-то информация"));

Это опять привело тебя к:

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

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

StringUtils.compare()

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


public static int compare(final String str1, final String str2)

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

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

Лексикографический порядок – это порядок по словарю. Давай посмотрим, как мы можем использовать это в нашей программе:


System.out.println(StringUtils.compare(null, null));
System.out.println(StringUtils.compare(null , "javaRush"));
System.out.println(StringUtils.compare("javaRush", null));
System.out.println(StringUtils.compare("javaRush", "JAVARUSH"));
System.out.println(StringUtils.compare("javaRush", "javaRush"));

Получаем:

0
-1
1
32
0

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

Проверяем, содержит ли строка другую подстроку

Для этого в StringUtils есть 5 методов:

  • contains()
  • containsIgnoreCase()
  • containsAny()
  • containsNone()
  • containsOnly()

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

Если в такой метод передать null, то он вернет false. Если передать не null, то метод просто вызовет java.lang.String.indexOf(String str) у передаваемого объекта.

Примеры:


String value = "JavaRush is cool";

System.out.println(StringUtils.contains(null, "a"));
System.out.println(StringUtils.contains(value, "JavaRush"));
System.out.println(StringUtils.contains(value, "C++"));
System.out.println(StringUtils.contains(value, "javarush"));

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

false
true
false
false

Метод containsAny() возвращает true, если строка, переданная первым аргументом, содержит хотя бы одну из подстрок, переданную 2-N аргументами.

Пример:


String value = "JavaRush is cool";
System.out.println(StringUtils.containsAny(value, "cool", "c00l", "bro", "hello"));

Выведет на экран:

true

Этот метод также чувствителен к регистру.

Метод containsNone()

Когда нужно проверить, что определенная строка не содержит ничего из списка, можно воспользоваться методом containsNone(). Первым параметром в него передается строка, а следующие параметры – это строки, которых не должно быть в целевой стоке.

Пример:


String s = "JavaRush is cool";
System.out.println(StringUtils.containsNone(s, 'g', 'a'));

Вывод в консоль:

false

Работа с подстроками

Работа с подстроками похожа на работу методов класса String:


substring(String str, int start)
substring (String str, int start, int end)

Эти методы возвращают подстроку из строки str. Строка задается двумя индексами: start и end. И как принято в Java, последний символ диапазона – end-1. В чем же преимущество этих методов?

Если передать в такой метод null, он просто вернет null, а не кинет исключение. Эти методы поддерживают отрицательные значение индексов. При этом строка рассматривается как замкнутая петля. После последнего символа идет первый и т.д.

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


System.out.println(StringUtils.substring("lets java", 2, 6));
System.out.println(StringUtils.substring("lets java", -8));
System.out.println(StringUtils.substring(null, 3));

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

ts j
ets java
null

StringUtils.split()

Метод, который позволяет разбить строку на подстроки, используя специальный символ-разделитель. Если такой есть в целевой строке, то метод вернет массив подстрок. Если символа нет – вернется пустой массив. Ну а если в метод передать null, он вернет null. Давай рассмотрим этот код и работу метода:


String myData = "Address, City, State, Zip, Phone, Email, Password";

System.out.println(Arrays.toString(StringUtils.split(myData, ',')));
System.out.println(Arrays.toString(StringUtils.split(null, '.')));
System.out.println(Arrays.toString(StringUtils.split("", '.')));

Результат:

[Address,  City,  State,  Zip,  Phone,  Email,  Password]
null
[]

StringUtils.join()

Метод join() позволяет склеить массив строк в одну строку. При этом в него можно передать специальный символ-разделитель, которые будет добавлен между подстроками в результирующей строке. А если в метод передать null, то он вернет null.

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


String myData = "Address, City, State, Zip, Phone, Email, Password";

String[] myString =  StringUtils.split(myData, ',');
System.out.println(StringUtils.join(myString, '-'));

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

Address- City- State- Zip- Phone- Email- Password

StringUtils.replace()

Ищет строку внутри строки, находит ее, если она существует, и заменяет все ее вхождения новой строкой.

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

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

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

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


String value = "JavaRush is the best";
System.out.println(StringUtils.replace(value, "best", "cool"));

Результат:

JavaRush is the cool
Комментарии (8)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Олег Уровень 106 Expert
13 сентября 2024
Тут всё понятно, задачи сделал
Иван Корниенко Уровень 109
8 июля 2024
JavaRush наконец-то оставил ссылки на источники, ура!
Ольга Уровень 72 Expert
11 апреля 2024
Работа с подстроками "После последнего символа идет первый и т.д." А разве не нулевой?
Александр Уровень 111
18 марта 2023
Вернуться к истокам - задача с изюминкой)))))) Кто решил с первого раза, тому респект, значит вы внимательно читаете условия задачи. Но я считаю это запрещенный прием со стороны автора задачи)))))) Так не честно. Сам не догадался. Пришлось посмотреть правильный ответ. Хотя был уверен, что решил правильно. Посмотрев ответ, возмутился, смотрю и вижу, автор задачи как-бы не прав, у меня же все правильно, а у него нет. А потом до меня как дошло... Вот жеш...
Пётр Уровень 95 Expert
16 апреля 2023
Что-то мне чтение условия не помогло, я даже так писал, чтобы соблюсти требование о проверке использования "символов":

return StringUtils.containsOnly(s,'H','e','l','o','\u0020','W','r','d','!');
Не прошло валидацию. Пришлось подглядывать.
Ольга Николенко Уровень 109 Expert
4 апреля 2024
Та же фигня, сделала отдельными символами, а принимает только строкой.
Роман Уровень 51
17 февраля 2023
по сути здесь несколько новых методов,авсе остальное равно стандартному функционалу Java,естьли смысл это использовать?
Gregory Parfer Уровень 82 Expert
21 февраля 2023
Если в обычные String'овые методы передать null выбросится исключение, что является довольно ресурсоемкой операцией, да и отлавливать это не самое приятное занятие, либо же почти перед каждым вызовом в таком случае нужно проверять не null ли там. В случае использования StringUtils мы можем об этом не думать. Например мы запрашиваем пароль от пользователя, и хотим сверить его с значением реального пароля (пароли в открытую не хранятся и не передаются, но для примера пусть так), и в таком случае нам не надо проверять передал ли пользователь значение отличное от null, мы просто можем сравнить его с правильным вариантом используя StringUtils.equals(). Пример скорее абстрактный, чем прикладной, в жизни так никто не делает, но все же