Вступление
Библиотека Apache Commons предоставляет множество новых интерфейсов, реализаций и классов, расширяющих ядро Java Framework. Это одна из лучших сторонних библиотек, которая присутствует во многих проектах.
В этой статье мы собрали Руководство по классу StringUtils Apache
Commons , которое предоставляет несколько очень хороших утилит и
инструментов для работы со строками, расширяя функциональность основного
класса - java.lang.String
.
StringUtils
, вероятно, является наиболее часто используемым классом
Apache Commons и содержит различные служебные и удобные методы,
которые позволяют разработчикам избегать написания шаблонного кода или
простого громоздкого кода для основных операций.
Зачем использовать StringUtils вместо строковых методов?
Многие методы в StringUtils
имеют свои эквиваленты в
java.lang.String
, но те, что находятся в StringUtils
являются
нулевыми . Это означает, что NullPointerException
не генерируются
в тех случаях, когда вы этого не ожидаете.
Как упоминалось ранее, Apache Commons содержит ряд методов, и мы рассмотрим некоторые из наиболее часто используемых:
- StringUtils.isEmpty () и StringUtils.isBlank ()
- StringUtils.equals ()
- StringUtils.compare ()
- StringUtils.indexOf ()
- StringUtils.lastIndexOf ()
- StringUtils.contains ()
- StringUtils.containsIgnoreCase ()
- StringUtils.containsAny ()
- StringUtils.containsNone ()
- StringUtils.containsOnly ()
- StringUtils.substring ()
- StringUtils.split ()
- StringUtils.join ()
- StringUtils.remove ()
- StringUtils.replace ()
- StringUtils.countMatches ()
Начало работы с Apache Commons
Чтобы иметь возможность использовать библиотеку Apache Commons, нам сначала нужно импортировать ее в наш проект.
Если вы используете Maven, импортируйте последнюю
зависимость
в файл pom.xml
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.11</version>
</dependency>
В качестве альтернативы, если вы используете Gradle:
compile group: 'org.apache.commons', name: 'commons-lang3', version: '3.11'
Имея commons-lang3
, мы можем перейти к обсуждению некоторых из
наиболее часто используемых методов StringUtils
. Давайте начнем!
Сравнение строк с Apache Commons
Сравнение строк, проверка, являются ли они пустыми или пустыми, или просто проверка, равны ли они, - довольно распространенные операции.
Начнем с некоторых методов, связанных со сравнением.
StringUtils.isEmpty () и StringUtils.isBlank ()
Эти два метода говорят сами за себя - они оба используются для проверки
наличия текста String
Оба они возвращают true
если String
действительно пуста. Кроме того, isBlank()
также вернет true
если
String
содержит только пробелы.
У них также есть свои обратные методы: isNotEmpty()
и isNotBlank()
.
Давайте посмотрим, как мы можем использовать isEmpty()
вместе с его
аналогом java.lang.String.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
Встроенный в java.lang.String
isEmpty()
не является нулевым. Он
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
И если мы протестируем эти методы на nullString
:
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
ссылки.
StringUtils.equals ()
Этот делает именно то, что вы думаете - сравнивает две строки и
возвращает 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.compare ()
Объявление этого метода выглядит следующим образом:
public static int compare(CharSequence str1, CharSequence str2)
Этот метод сравнивает две String
лексикографически, так же, как
java.lang.String.compareTo()
, возвращая:
0
еслиstr1
равенstr2
(или оба равныnull
)- Значение меньше
0
еслиstr1
меньшеstr2
- Значение больше
0
еслиstr1
большеstr2
В этой статье мы не будем обсуждать, что именно означает лексикографическое сравнение двух
String
, поэтому, если вам интересно узнать об этом больше, проверьте эту ссылку.
Теперь давайте посмотрим, как мы можем использовать его в нашей программе:
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
Теперь давайте взглянем на группу методов, которые имеют дело с проверками индекса, конечно, безопасным для null способом. У всех этих методов есть несколько перегруженных вариантов, но наиболее общие из них:
public static int indexOf(CharSequence seq, CharSequence searchSeq)
public static int lastIndexOf(CharSequence seq, CharSequence searchSeq)
public static boolean contains(CharSequence seq, CharSequence searchSeq)
Есть одна общая черта: все они используют свои null
безопасные
варианты из java.lang.String
если это возможно. Поясним это немного
подробнее.
StringUtils.indexOf ()
Этот метод, как и встроенный, будет искать индекс первого появления
последовательности в другой последовательности. Если встроенный
java.lang.String.indexOf()
не создает NullPointerException
, он
будет использован. Если нет, то вступает в действие реализация Apache
Commons.
Возвращаемое значение - это первый найденный индекс или -1
если
совпадений нет или входная строка null
.
Теперь напишем код:
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
StringUtils.lastIndexOf ()
Метод lastIndexOf()
работает почти так же, как indexOf()
, но
возвращает последнее вхождение, а не первое в поисковой
последовательности.
Давайте запустим тот же код, что и раньше:
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.contains ()
Метод contains()
возвращает true
или false
зависимости от того,
содержится ли последовательность поиска в другой последовательности или
нет.
В случае успеха этот метод также использует
java.lang.String.indexOf(String)
. В случае ввода 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.containsAny ()
containsAny()
принимает vararg, помимо String, в которой мы ищем. Он
возвращает true
если искомая последовательность содержит какие-либо
элементы из vararg:
String s = "Java is a general-purpose programming language";
System.out.println(StringUtils.containsAny(s, "general", "python", "something", "javascript"));
Это приводит к:
true
Этот метод также чувствителен к регистру, поэтому помните об этом.
StringUtils.containsNone ()
Вместо того, чтобы создавать крайние случаи с помощью предыдущего
метода, вы можете просто использовать containsNone()
если хотите,
чтобы строка не содержала никаких элементов, которые вы вставили как
vararg:
String s = "Java is a general-purpose programming language";
System.out.println(StringUtils.containsNone(s, "general", "python", "something", "javascript"));
Это приводит к:
false
StringUtils.containsOnly ()
Или, если вы хотите проверить, содержит ли String только
предопределенное вами содержимое, вы можете использовать метод
containsOnly()
:
String s = "Java";
System.out.println(StringUtils.containsOnly(s, "Java"));
Это приводит к:
true
Методы подстроки Apache Commons
StringUtils.substring ()
Среди множества доступных перегруженных вариантов этого метода мы обсудим два из них:
substring(String str, int start)
substring(String str, int start, int end)
Этот метод возвращает подстроку, начинающуюся с start
до конца
String
, или end
индекс.
Мы также можем использовать отрицательное число для start
, что даст
нам подстроку, которая начинается на n
символов с конца String
.
Если есть 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.split ()
При условии , с String
и символом - разделителем, этот метод будет
разделить String
и поместить его в массив.
Элементами результирующего массива являются подстроки, разделенные
разделителями в исходной String
. Разделитель не включается в
окончательный массив после разделения.
Как и в случае с другими методами в 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.join ()
Этот метод представляет собой прямую противоположность методу split()
После разделения String
с помощью символа-разделителя мы можем так же
легко присоединиться к ней с помощью join()
, предоставив список или
массив элементов. Он возвращает String
созданный путем склеивания
предоставленных элементов вместе с использованием разделителя. Если
введено значение null
, метод возвращает значение null
.
Давайте посмотрим на этот простой пример:
String csvString = "Id, Name, Age, Location";
String[] myStr = StringUtils.split(csvString, ',');
System.out.println(StringUtils.join(myStr, ';'));
Выполнение приведенного выше кода дает нам:
Id; Name; Age; Location
StringUtils.remove ()
Мы хотим рассмотреть два варианта этого метода:
public static String remove(String str, char remove)
public static String remove(String str, String remove)
Они оба делают одно и то же, за исключением того, что второй удаляет все
вхождения подстроки , а первый удаляет все вхождения символа из
данной String
str
.
Если введено значение null
, метод возвращает значение null
.
Для этого мы разделим примеры на два отдельных блока кода, потому что
может быть немного сложно различить их на основе первого взгляда. Начнем
с remove(String str, char remove)
:
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.replace ()
Как и большинство рассмотренных нами методов, этот также очень понятен -
он ищет String
в String
, находит ее, если она существует, и
заменяет все ее вхождения на новую String
.
Объявление этого метода выглядит следующим образом:
public static String replace(String text, String searchString, String replacement)
Если searchString
не найден в text
, ничего не происходит, и наш
text
остается прежним. Следуя той же логике, если text
имеет
значение null
, этот метод возвращает значение null
.
Если какой- либо из searchString
или replacement
имеет значение
null
, метод возвращает его источник, то есть text
.
Давайте попробуем этот метод:
String string = "a simple sentence";
System.out.println(StringUtils.replace(string, "simple", "complicated"));
Это приведет к:
a complicated sentence
StringUtils.countMatches ()
countMatches()
подсчитывает, сколько раз указанный символ (или
подстрока) появляется в данной строке. 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
Заключение
В этой статье мы рассмотрели некоторые из наиболее часто используемых и
известных методов в классе StringUtils
Apache Commons.
Методы, найденные в StringUtils
являются нулевыми и предоставляют
базовые, а также расширенные функциональные возможности для встроенных
методов String.