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

Введение Библиотека Apache Commons [https://commons.apache.org/] предоставляет множество новых интерфейсов, реализаций и классов, расширяющих ядро Java Framework. Это одна из лучших сторонних библиотек, которая присутствует во многих проектах. В этой статье мы собрали Руководство по классу StringUtils Apache Commons, которое предоставляет несколько очень хороших утилит и инструментов для работы со строками, расширяя функциональность основного класса - java.lang.String. StringUtils, вероятно, самый

Вступление

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

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

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

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

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

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

Начало работы с 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 ()

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

  1. substring(String str, int start)
  2. 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.

comments powered by Disqus