Вступление
Библиотека 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.подстрока()
Среди многих доступных перегруженных вариантов этого метода мы обсудим два из них:
подстрока(строка str, начало int)
подстрока(строка 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
, безопасны для нуля и обеспечивают базовую, а также расширенную функциональность встроенных строковых методов.