Клас StringUtils бібліотеки Apache Commons Lang, надає велику кількість методів для роботи з рядками, розширюючи функціональність основного класу – java.lang.String, та дозволяє розробникам уникати написання шаблонного або просто громіздкого коду для базових операцій з рядками.
Переваги використання StringUtils
Багато методів класу StringUtils мають еквіваленти в java.lang.String, але методи StringUtils є null безпечними. Це означає, що виключення NullPointerException не генерується у випадках, коли його виникнення не очікується.
Початок роботи
Для можливості використання класу StringUtils, потрібно підключити залежність від бібліотеки Apache Commons Lang. Приклад для maven:
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.15.0</version>
</dependency>В цьому записі будуть розглянуті основні методи класу StringUtils, з прикладами використання:
- isEmpty() та isBlank()
- equals()
- compare()
- indexOf() та lastIndexOf()
- contains()
- containsAny(), containsNone() та containsOnly()
- substring()
- split()
- join()
- remove()
- replace()
- countMatches()
isEmpty() та isBlank()
Обидва методи перевіряють наявність в рядку будь-якого тексту, та повертають true, якщо рядок порожній. Крім того, isBlank() повертає true, якщо рядок містить лише пробіли. Приклади:
System.out.println(StringUtils.isEmpty(null)); // true
System.out.println(StringUtils.isEmpty("")); // true
System.out.println(StringUtils.isEmpty("\n \t \n")); //false
System.out.println(StringUtils.isBlank("\n \t \n")); // trueСлід звернути увагу, що перевірка для null, повертає результат true. Це завдяки тому, що методи класу StringUtils є null безпечними. При використанні методу isEmpty(), вбудованого у java.lang.String, для цього випадку буде згенеровано виключення NullPointerException (тож доведеться перевіряти посилання на null заздалегідь). Докладніше про null та NullPointerException за посиланнями:
StringUtils також має зворотні методи: isNotEmpty() та isNotBlank().
equals()
Порівнює два рядки і повертає true, якщо вони еквівалентні (або обидва посилання вказують на null). Слід мати на увазі, що цей метод чутливий до регістру. Приклади:
System.out.println(StringUtils.equals(null, null)); // true
System.out.println(StringUtils.equals(null, "some string")); // false
System.out.println(StringUtils.equals("some text", "some text")); // true
System.out.println(StringUtils.equals("text", "some text")); // false
System.out.println(StringUtils.equals("some text", "Some text")); // falseДля порівняння двох рядків на еквівалентність, незалежно від їх регістру, слід використовувати метод equalsIgnoreCase:
System.out.println(StringUtils.equalsIgnoreCase("some text", "Some text")); // truecompare()
Порівнює два рядки лексикографічно, так само як java.lang.String.compareTo(), та повертає:
- 0, якщо рядок 1 дорівнює рядку 2 (або обидва дорівнюють null)
- значення менше 0, якщо рядок 1 менше ніж рядок 2
- значення більше 0, якщо рядок 1 більше ніж рядок 2
Приклади:
System.out.println(StringUtils.compare(null, null)); // 0
System.out.println(StringUtils.compare(null , "a")); // -1
System.out.println(StringUtils.compare("a", null)); // 1
System.out.println(StringUtils.compare("a", "b")); // -1
System.out.println(StringUtils.compare("a", "a")); // 0Доповнення про лексикографічне порівняння двох рядків можна прочитати за посиланням: java.lang.String compareTo
Для порівняння рядків, незалежно від регістру символів, слід використовувати метод compareIgnoreCase:
System.out.println(StringUtils.compare("a", "A")); // 32
System.out.println(StringUtils.compareIgnoreCase("a", "A")); // 0indexOf() та lastIndexOf()
Метод indexOf() шукає індекс першого входження послідовності символів, в іншій послідовності символів. Метод повертає індекс першого входження, або -1 якщо не знайдено жодного збігу, чи вхідний рядок дорівнює null. Приклади:
String text = "Hello world Java";
System.out.println(StringUtils.indexOf(null, "a")); // -1
System.out.println(StringUtils.indexOf(text, "Java")); // 12
System.out.println(StringUtils.indexOf(text, "Python")); // -1Метод lastIndexOf() працює майже так само як indexOf(), але повертає індекс останнього входження, замість першого.
contains()
Метод contains() повертає true або false в залежності від того, чи містить визначена послідовність символів, іншу послідовність символів. Приклади:
String text = "Hello world Java";
System.out.println(StringUtils.contains(null, "a")); // false
System.out.println(StringUtils.contains(text, "Java")); // true
System.out.println(StringUtils.contains(text, "java")); // falsecontains() є чутливим до регістру, тож останній рядок з прикладу повертає false. Якщо регістр не має значення, слід використовувати метод containsIgnoreCase(), котрий працює аналогічно contains(), але не є чутливим до регістру:
String text = "Hello world Java";
System.out.println(StringUtils.containsIgnoreCase(text, "java")); // truecontainsAny(), containsNone() та containsOnly()
Метод containsAny() перевіряє, що CharSequence (послідовність символів) містить будь-який символ з заданого набору символів:
System.out.println(StringUtils.containsAny("abc", 'd', 'e', 'f')); // false
System.out.println(StringUtils.containsAny("abc", 'a', 'd', 'e')); // trueТакож слід додати, що цей метод чутливий до регістру, але має версію що ігнорує регістр containsAnyIgnoreCase().
Метод containsNone() перевіряє, що CharSequence не містить певних символів:
String text = "Java.";
System.out.println(StringUtils.containsNone(text, '*', '#', '?')); // true
System.out.println(StringUtils.containsNone(text, ',', '.')); // falseМетод containsOnly() перевіряє, що CharSequence містить лише певні символи:
System.out.println(StringUtils.containsOnly("abab", "abc")); // true
System.out.println(StringUtils.containsOnly("abz", "abc")); // falsesubstring()
Має декілька перевантажених варіантів, розглянемо два з них:
public static String substring(String str, int start)
public static String substring(String str, int start, int end)Цей метод повертає підрядок іншого рядка, що починається зі вказаного індексу (int start), і йде до кінця рядка, або до індексу завершення (int end, якщо його передано третім параметром).
Також є можливість використовувати від’ємне число в якості параметру start. В такому випадку, буде отримано підрядок що починається за n символів від кінця рядка:
String text = "Hello world Java";
System.out.println(StringUtils.substring(text, 6)); // world Java
System.out.println(StringUtils.substring(text, -4)); // Java
System.out.println(StringUtils.substring(null, 6)); // nullsplit()
Розділяє рядок на підрядки, поміщаючи їх у масив. Розбиття рядка відбувається на основі отриманого розділювача (символ, рядок, тощо). При цьому роздільник не включається до кінцевого масиву, після розділення.
Розглянемо приклади роботи методу split():
String csvString = "Id, Name, Age, Location";
System.out.println(Arrays.toString(StringUtils.split(csvString, ',')));
// [Id, Name, Age, Location]
System.out.println(Arrays.toString(StringUtils.split(null, '.')));
// null
System.out.println(Arrays.toString(StringUtils.split("", '.')));
// []Метод split() повертає null, якщо на вході отримано null.
join()
Метод join() є протилежністю методу split(), але на відміну від split(), він об’єднує елементи (масиву, списку). join() повертає рядок, створений шляхом склеювання наданих елементів за допомогою роздільника.
Розглянемо базовий приклад:
String csvString = "Id,Name,Age,Location";
String[] values = StringUtils.split(csvString, ',');
System.out.println(Arrays.toString(values));
// [Id, Name, Age, Location]
System.out.println(StringUtils.join(values, ';'));
// Id;Name;Age;LocationЯкщо вхідні дані є null, метод повертає null.
remove()
Цей метод має два варіанти:
public static String remove(String text, char remove)
public static String remove(String text, String remove)Обидва роблять те саме, за винятком того, що перший видаляє із заданого рядка (String text), кожне входження символу (char remove), а другий кожне входження підрядка (String remove):
System.out.println(StringUtils.remove(null, 'a')); // null
System.out.println(StringUtils.remove("", 'a')); //
System.out.println(StringUtils.remove("queued", 'u')); // qeed
System.out.println(StringUtils.remove(null, "abc")); // null
System.out.println(StringUtils.remove("", "abc")); //
System.out.println(StringUtils.remove("abc", null)); // abc
System.out.println(StringUtils.remove("queued", "ue")); //qdМетод remove() повертає null, якщо замість рядка з котрого планується видалення, отримує null в параметрі.
replace()
Цей метод шукає заданий рядок в іншому рядку, і в разі якщо рядок знайдено, замінює всі його входження новим рядком.
Синтаксис методу replace() виглядає наступним чином:
public static String replace(String text, String searchString, String replacement)Якщо пошуковий рядок не знайдено в тексті, нічого не відбувається, текст залишається незмінним. Якщо текст дорівнює null, метод replace() повертає null.
Приклад використання методу replace():
String string = "Java, Python, JavaScript";
System.out.println(StringUtils.replace(string, "JavaScript", "TypeScript"));
// Java, Python, TypeScriptcountMatches()
countmatches() підраховує кількість входжень заданого символу (або рядка), в іншому рядку. Приклад:
String string = "Java, JavaScript, Python";
System.out.println(StringUtils.countMatches(null, 'J')); // 0
System.out.println(StringUtils.countMatches(string, "Java")); // 2
System.out.println(StringUtils.countMatches(string, "TypeScript")); // 0Підсумок
В цьому записі розглянуто деякі з найбільш використовуваних методів класу StringUtils бібліотеки Apache Commons Lang. Методи класу StringUtils є null-безпечними, на відміну від вбудованих методів для роботи з рядками класу java.lang.String.