Вступление
Библиотека 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"
Здесь следует отметить одну вещь, которую легко упустить из виду: когда параметр
removenullзначение, возвращается исходная строка.
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.