Rozwój klasy String w Java od wersji 8 do 15.

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.

← Previous post

Next post →

3 Comments

  1. Fajny, treściwy artykuł, dzięki!

  2. 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.

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *