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 33Java 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 snowPowtarzanie
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, o ile 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.