Wprowadzenie do StringUtils

StringUtils to najczęściej używana klasa Apache Commons. Zawiera różne narzędzia i metody, które pomagają programistom uniknąć pisania szablonów lub po prostu nieporęcznego kodu do podstawowych operacji.

Wiele metod w klasie StringUtils ma odpowiedniki java.lang.String , ale w przeciwieństwie do metod java.lang.String są bezpieczne dla wartości null. Oznacza to, że wyjątek NullPointerException nie jest zgłaszany w najbardziej nieoczekiwanym momencie.

Apache Commons zawiera wiele metod, a my przyjrzymy się niektórym z najczęściej używanych.

Lista metod StringUtils:

jest pusty() Sprawdza, czy łańcuch jest pusty
równa się() Porównuje łańcuchy
porównywać() Porównuje łańcuchy
indeks() Znajdowanie podłańcucha w ciągu
lastIndexOf() Znajdowanie podłańcucha w ciągu
zawiera() Sprawdza, czy podłańcuch znajduje się w łańcuchu
zawieraIgnoreCase() Sprawdza występowanie podłańcucha w łańcuchu, ignorując wielkość liter
zawieraDowolny() Sprawdza, czy podłańcuch występuje w dowolnym miejscu ciągu
zawiera Brak() Sprawdza, czy podłańcuch występuje w dowolnym miejscu ciągu
zawieraTylko() Sprawdza, czy podłańcuch znajduje się w łańcuchu
podłańcuch() Pobieranie podciągu
podział() Podział łańcucha na podciągi
dołączyć() łączyć podciągi
usunąć() Usuwanie podciągu
zastępować() Zastąp podciąg
countMatches() Liczenie liczby dopasowań

StringUtils.isEmpty() i StringUtils.isBlank()

Obie metody służą do sprawdzania, czy łańcuch zawiera jakikolwiek tekst. Zwracają wartość true, jeśli łańcuch jest naprawdę pusty. Dodatkowo funkcja isBlank() zwróci również wartość true , jeśli łańcuch zawiera tylko spacje.

Mają też własne metody odwrotne: isNotEmpty() i isNotBlank() .

Zobaczmy, jak możesz użyć funkcji isEmpty() wraz z jej odpowiednikiem java.lang.String.isEmpty() , a także funkcji isBlank() :

String nullValue = null;
String emptyValue = "";
String blankValue = "\n \t   \n";

if(StringUtils.isEmpty(emptyValue)) {
   System.out.println("emptyValue is emptyValue");
}

if(StringUtils.isBlank(blankValue)) {
   System.out.println("blankValue is blankValue");
}

if(!nullValue.isEmpty()) {
   System.out.println("nullString isn't null");
}

Istnieją tutaj trzy zmienne typu String . Jeden wskazuje na null , drugi nie jest pusty , ale nie ma treści (pusty ciąg znaków), a trzeci nie jest pusty, ale wypisze pusty wynik.

Uruchomienie tego kodu powoduje:

emptyValue is emptyValue
blankValue is blankValue
Exception in thread "main" java.lang.NullPointerException

Metoda isEmpty() wbudowana w java.lang.String nie jest bezpieczna dla wartości null . Łatwo otrzymasz wyjątek NullPointerException, jeśli spróbujesz sprawdzić, czy jest pusty, ponieważ wywołujesz metodę na odwołaniu o wartości null . Konieczne będzie wcześniejsze sprawdzenie, czy referencja jest pusta:

String nullValue = null;
String emptyValue = "";
String blankValue = "\n \t   \n";

if(StringUtils.isEmpty(emptyValue)) {
   System.out.println("emptyValue is emptyValue");
}

if(StringUtils.isBlank(blankValue)) {
   System.out.println("blankValue is blankValue");
}

if(nullValue != null && !nullValue.isEmpty()) {
   System.out.println("nullString isn't null");
}

Teraz skutkuje to:

emptyValue is emptyValue
blankValue is blankValue

A jeśli przetestujemy te metody nanullString:

String nullValue = null;

if(StringUtils.isEmpty(nullValue)) {
   System.out.println("nullValue is emptyValue");
}

if(StringUtils.isBlank(nullValue)) {
   System.out.println("nullValue is blankValue");
}

Następnie otrzymujemy:

nullValue is emptyValue
nullValue is blankValue

Metody StringUtils są null bezpieczne i dają oczekiwany wynik, nawet jeśli zostaną przekazane null .

StringUtils.equals()

Ta metoda porównuje dwa łańcuchy i zwraca wartość true , jeśli są one identyczne lub jeśli oba odniesienia wskazują na null , ale należy pamiętać, że w tej metodzie rozróżniana jest wielkość liter.

Zobaczmy, jak to działa:

System.out.println(StringUtils.equals(null, null));
System.out.println(StringUtils.equals(null, "some information"));
System.out.println(StringUtils.equals("some information", null));
System.out.println(StringUtils.equals("some information",  "some information"));
System.out.println(StringUtils.equals("some additional information", "some information"));

Wynik:

true
false
false
true
false

Aby porównać metodę equals() z StringUtils z java.lang.String.equals() :

String nullValue = null;

System.out.println(StringUtils.equals(nullValue, null));
System.out.println(StringUtils.equals(nullValue, "some information"));

System.out.println(nullValue.equals(null));
System.out.println(nullValue.equals("some information"));

Spowoduje to powrót do:

true
false
Exception in thread "main" java.lang.NullPointerException

Ponownie wywołanie metody na odwołaniu o wartości null skutkuje wyjątkiem NullPointerException i przed użyciem należy sprawdzić, czy zmienna odniesienia ma wartość null .

StringUtils.compare()

Deklaracja tej metody wygląda następująco:

public static int compare(final String str1, final String str2)

Ta metoda porównuje leksykograficznie dwa ciągi, tak jak robi to metoda java.lang.String.compareTo() , zwracając:

  • 0 jeśli str1 jest równe str2 (lub oba są puste)
  • Wartość jest mniejsza niż 0, jeśli str1 jest mniejsze niż str2
  • Wartość większa niż 0, jeśli str1 jest większe niż str2

Porządek leksykograficzny jest porządkiem słownikowym. Zobaczmy, jak możemy to wykorzystać w naszym programie:

System.out.println(StringUtils.compare(null, null));
System.out.println(StringUtils.compare(null , "codeGym"));
System.out.println(StringUtils.compare("codeGym", null));
System.out.println(StringUtils.compare("codeGym", "CODEGYM"));
System.out.println(StringUtils.compare("codeGym", "codeGym"));

Otrzymujemy:

0
-1
1
32
0

Uwaga: wartość null jest uważana za mniejszą niż wartość inna niż null . Dwie wartości null są uważane za równe.

Sprawdzanie, czy łańcuch zawiera inny podciąg

Aby to zrobić, StringUtils ma 5 metod:

  • zawiera()
  • zawieraIgnoreCase()
  • zawieraDowolny()
  • zawiera Brak()
  • zawieraTylko()

Metoda zawiera() zwraca wartość true lub false w zależności od tego, czy wyszukiwana sekwencja jest zawarta w innej sekwencji, czy nie.

Jeśli do takiej metody zostanie przekazana wartość null , zwróci ona wartość false . Jeśli zostanie przekazana wartość różna od null , metoda po prostu wywoła java.lang.String.indexOf(String str) na przekazanym obiekcie.

Przykłady:

String value = "CodeGym is cool";

System.out.println(StringUtils.contains(null, "a"));
System.out.println(StringUtils.contains(value, "CodeGym"));
System.out.println(StringUtils.contains(value, "C++"));
System.out.println(StringUtils.contains(value, "codegym"));

W metodzie rozróżniana jest wielkość liter, więc ostatnie wywołanie również zwróci false :

false
true
false
false

Metoda zawieraAny() zwraca wartość true , jeśli łańcuch przekazany jako pierwszy argument zawiera co najmniej jeden z podłańcuchów przekazanych w argumentach 2-N.

Przykład:

String value = "CodeGym is cool";
System.out.println(StringUtils.containsAny(value, "cool", "c00l", "bro", "hello"));

Wyświetli się:

true

Ta metoda uwzględnia również wielkość liter.

zawiera metodę None().

Gdy chcesz sprawdzić, czy określony ciąg znaków nie zawiera niczego z listy, możesz użyć metody availableNone() . Pierwszy parametr to ciąg, a następujące parametry to ciągi, które nie powinny znajdować się w docelowym ujściu.

Przykład:

String s = "CodeGym is cool";
System.out.println(StringUtils.containsNone(s, 'g', 'a'));

Wyjście konsoli:

false

Praca z podciągami

Praca z podłańcuchami jest podobna do pracy z metodami klasy String :

substring(String str, int start)
substring (String str, int start, int end)

Te metody zwracają podłańcuch z ciągu str . Łańcuch jest określony przez dwa indeksy: start i end . I jak zwykle w Javie, ostatnim znakiem zakresu jest end-1 . Jaka jest zaleta tych metod?

Jeśli przekażesz null takiej metodzie , po prostu zwróci ona wartość null zamiast zgłaszać wyjątek. Te metody obsługują ujemne wartości indeksu. W tym przypadku łańcuch jest traktowany jako zamknięta pętla. Po ostatnim znaku następuje pierwszy i tak dalej.

Zobaczmy, jak możemy to wykorzystać:

System.out.println(StringUtils.substring("lets java", 2, 6));
System.out.println(StringUtils.substring("lets java", -8));
System.out.println(StringUtils.substring(null, 3));

Uruchomienie powyższego kodu daje nam:

ts j
ets java
null

StringUtils.split()

Metoda umożliwiająca podzielenie łańcucha na podciągi za pomocą specjalnego znaku ogranicznika. Jeśli w ciągu docelowym jest jeden, metoda zwróci tablicę podciągów. Jeśli nie ma znaku, zwrócona zostanie pusta tablica. Cóż, jeśli null zostanie przekazane do metody , zwróci ona wartość null . Rzućmy okiem na ten kod i sposób działania metody:

String myData = "Address, City, State, Zip, Phone, Email, Password";

System.out.println(Arrays.toString(StringUtils.split(myData, ',')));
System.out.println(Arrays.toString(StringUtils.split(null, '.')));
System.out.println(Arrays.toString(StringUtils.split("", '.')));

Wynik:

[Address,  City,  State,  Zip,  Phone,  Email,  Password]
null
[]

StringUtils.join()

Metoda join() umożliwia połączenie tablicy łańcuchów w jeden ciąg. Jednocześnie można do niego przekazać specjalny znak separatora, który zostanie dodany pomiędzy podłańcuchami w wynikowym ciągu. A jeśli do metody zostanie przekazana wartość null , zwróci ona wartość null .

Ta metoda jest dokładnym przeciwieństwem metody split() . Spójrzmy na ten prosty przykład:

String myData = "Address, City, State, Zip, Phone, Email, Password";

String[] myString =  StringUtils.split(myData, ',');
System.out.println(StringUtils.join(myString, '-'));

Uruchomienie powyższego kodu daje nam:

Address- City- State- Zip- Phone- Email- Password

StringUtils.replace()

Wyszukuje ciąg w ciągu, znajduje go, jeśli istnieje, i zastępuje wszystkie jego wystąpienia nowym ciągiem.

Deklaracja tej metody wygląda następująco:

public static String replace(final String text, final String searchString, final String replacement)

Jeśli wyszukiwany ciąg nie zostanie znaleziony w tekście, nic się nie stanie, a tekst pozostanie taki sam. Zgodnie z tą samą logiką, jeśli tekst jest null , ta metoda zwraca null . Jeśli szukasz łańcucha zerowego lub zastępujesz podłańcuch przez null , metoda zwróci oryginalny ciąg.

Spróbujmy tej metody:

String value = "CodeGym is the best";
System.out.println(StringUtils.replace(value, "best", "cool"));

Wynik:

CodeGym is the cool