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

blog.lantkowiak.pl 3 lat temu

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

Idź do oryginalnego materiału