String, czyli klasa odpowiedzialna za przechowywanie łańcuchów znaków, jest niewątpliwie klasą, której nie trzeba przedstawiać i z pewnością jest jedną z najczęściej używanych klas w Java. Dzisiaj zobaczymy jakie dodatkowe metody zostały dodane do tej klasy od wersji 8 do 15.
Java 8
W Javie 8 String wzbogacił się o dwie metody statyczną join. Przyjmuje ona separator (delimiter) jako pierwszy parametr i tablicę lub listę Stringów, które mają zostać połączone w jeden ciąg znaków jako drugi parametr.
Sygnatury tych metod wyglądają jak poniżej:
public static String join(CharSequence delimiter, CharSequence... elements)
public static String join(CharSequence delimiter, Iterable<? extends CharSequence> elements)
I teraz pora na przykład użycia wraz z wynikiem 🙂
String result = String.join(", ", "pies", "kot", "papuga");
System.out.println("result = " + result);
result = pies, kot, papuga
Java 9
Kolejna wersja Javy przyniosła kolejne dwie metody do klasy String – chars() oraz codePoints(). Ich sygnatury wyglądają odpowiednio:
public IntStream chars()
public IntStream codePoints()
Metody służą zwracają IntStream dla znaków, z których składa się String. Pierwsza metoda zwraca stream z wartościami, które mogliśmy wcześniej uzyskać przy pomocy metod String#charAt(int) czy String#toCharArray().
Druga metoda zwraca wartości, które mogliśmy uzyskać wcześniej przy pomocy metody String#codePointAt(int).
Poniżej możemy zobaczyć przykłady użycia powyższych metod 🙂
String value = "Hello!"; value.chars().forEach(i -> System.out.print(i + " ")); System.out.println(); value.codePoints().forEach(i -> System.out.print(i + " "));
I wynik wykonania powyższego kodu:
72 101 108 108 111 33 72 101 108 108 111 33
Java 10
W Javie 10 nie otrzymaliśmy żadnych nowych metod w klasie String.
Java 11
W Javie 11 możemy znaleźć aż 6 nowych metod.
Strip w 3 odmianach
Najpierw omówmy 3 metody, które służą do pozbywania się białych znaków ze Stringa. Od wersji 11 możemy znaleźć następujące metody:
- strip()
- stripLeading()
- stripTrailing()
Ich sygnatury wyglądają następująco:
public String strip()
public String stripLeading()
public String stripTrailing()
Metody te służą do usuwania białych znaków ze Stringa odpowiednio:
- z początku i końca łańcucha znaków,
- z początku łańcucha znaków,
- z końca łańcucha znaków.
I standardowo przykład użycia 🙂
String value = "\t Hello!\t ";
System.out.println("\"" + value.strip() + "\"");
System.out.println("\"" + value.stripLeading() + "\"");
System.out.println("\"" + value.stripTrailing() + "\"");
"Hello!" "Hello! " " Hello!"
Czy łańcuch jest pusty?
Kolejną metodą, którą poznajemy w Javie 11 jest metoda isBlank() z poniższą sygnaturą.
public boolean isBlank()
Metoda pozwala nam sprawdzić czy łańcuch znaków jest pusty (długość jest równa 0) lub zawiera tylko białe znaki.
Zobaczmy teraz przykład użycia i wynik poniższego kodu:
String value1 = "\t ";
String value2 = "\t Hello";
System.out.println(value1.isBlank());
System.out.println(value2.isBlank());
true false
Linia po linii
Następną metodą jest lines(), która zwraca nam Stream, który umożliwia iteracje po liniach tekstu. Przez znaki nowej linii powinniśmy rozumieć:
- \n
- \r
- \r\n
Sygnatura metody wygląda następująco:
public Stream<String> lines()
I przykład użycia:
String value = "Don't\neat\ryellow\r\nsnow";
value.lines().forEach(System.out::println);
oraz wynik:
Don't eat yellow snow
Powtarzanie
Ostatnią nową metodą dostępna w Javie 11 jest metoda repeat o następującej sygnaturze:
public String repeat(int count)
Metoda zwraca nam nasz łańcuch znaków powtórzony o daną liczbę razy.
I lecimy z przykładem 🙂
String value = "Hello!";
System.out.println(value.repeat(3));
Hello!Hello!Hello!
Java 12
Kolejna wersja Javy dostarczyła kolejne 4 metody do klasy String.
Wcięcie
Pierwszą metodąm którą omówimy będzię indent, której sygnatura wygląda następująco:
public String indent(int n)
Metoda pozwala na ustawienie takiego samego wcięcia dla każdej linii tekstu z naszego łańcucha tekstowego. Linie w Stringu powinniśmy rozumieć w dokładnie taki sam sposób jak to się dzieję w metodzie lines opisanej wyżej.
Poniżej możemy zobaczyć przykład użycia wraz z wynikiem:
String value = "Don't\neat\ryellow\r\nsnow";
value.indent(4).lines().forEach(l -> System.out.println("\"" + l + "\""));
" Don't" " eat" " yellow" " snow"
Transformacja!
Kolejna metoda to transform, która umożliwia nam dokonania transformacji na naszym łańcuchu znaków przy pomocy Function.
I oczywiście przykład użycia 🙂
String value = "hello!"; String result = value.transform(String::toUpperCase); System.out.println(result);
HELLO!
Nowe interfejsy w Stringu
W Javie 12 klasa String implementuje dwa nowe interfejsy: Constable oraz ConstantDesc. Interfejsy te powstały, żeby definiować, które klasy mogą zostać użyte w Constant Pool, który jest częścią skompilowanego pliku źródłowego klasy Javovej czyli pliku .class.
Powyższe dwa interfejsy dostarczają po jednej metodzie i są to odpowiednio describeConstable oraz resolveConstantDesc.
Optional<? extends ConstantDesc> describeConstable()
Object resolveConstantDesc(MethodHandles.Lookup lookup) throws ReflectiveOperationException;
W przypadku Stringa, pierwsza metoda zawsze zwróci instancje naszego łańcucha opakowaną w Optional. Druga natomiast zawsze zawróci instancję naszego Stringa, niezależnie od przekazanego parametru.
I przykłady użycia oczywiście wraz z wynikiem:
String value = "Hello!"; System.out.println(value.describeConstable()); System.out.println(value.resolveConstantDesc(null));
Optional[Hello!] Hello!
Java 13 i 14
W kolejnych dwóch wersjach Javy klasa String nie została zmieniona.
Java 15
W tej wersji otrzymaliśmy 3 nowe metody.
Usuwanie wcięcia
Pierwszą metodą, którą omówimy jest stripIndent o poniższej sygnaturze:
public String stripIndent()
Metoda służy do usuwania wcięcia na początku każdej linii. Przez wcięcie powinniśmy rozumieć najmniejsze wcięcie, które pojawia się w naszym łańcuchu znaków. Czyli na przykład, jeżeli pierwsza linia zaczyna się od dwóch spacji, a druga linia od 1 spacji to głębokość wcięcia, które zostanie usunięte ze wszystkich linii to 1.
Możemy to prześledzić na poniższym przykładzie:
String value = " Don't\n eat\n yellow\n snow";
System.out.println(value.stripIndent());
Don't eat yellow snow
Tłumaczenie znaków specjalnych
Kolejną metodą jest translateEscapes, która umożliwia wychwycenie znaków specjalnych jak znak nowej linii czy tabulatora w tekście i ich odpowiednią interpretacje.
Sygnatura metody jest następująca:
public String translateEscapes()
Na przykładzie możemy zobaczyć o co dokładnie chodzi w działaniu metody.
String value = "Don't\\neat\\tyellow\\ssnow";
System.out.println(value.translateEscapes());
Don't eat yellow snow
Formatowanie
Ostatnią metodą, którą omówimy jest metoda formatted służąca do formatowania Stringa i 'wstawianiu’ do niego podanych argumentów.
Sygnatura wygląda w następujący sposób:
public String formatted(Object... args)
I przykład użycia wraz z resultatem:
String value = "String value: %s \nInteger value: %d";
System.out.println(value.formatted("sv1", 15));
String value: sv1 Integer value: 15
Podsumowanie
Dzisiaj zapoznaliśmy się ze wszystkimi metodami, które zostały dodane do Stringa od Javy 8. Wiele z tych metod z pewnością może nam się przydać na codzień i jednocześnie może zastąpić metody utilsowe, które używaliśmy do tej pory.
Tomek Nurkiewicz
Fajny, treściwy artykuł, dzięki!
Tomasz Kuczma
Nieźle! Warto wspomnieć, że ewolucja klasy String to nie tylko nowe metody, ale także jej nowe wnętrze. W Java 9 został dodany Compact String – https://openjdk.java.net/jeps/254.
Łukasz Antkowiak
słuszna uwaga, dzięki za komentarz 🙂