1. Konwersja danych

Klasa Stream<T>posiada również metodę, która pozwala konwertować dane z jednego typu na inny. Ta metoda nazywa się map().

Zwraca również strumień Stream<R>, ale z elementami nowego typu. Jako parametr do metody map()musisz przekazać funkcję, która konwertuje jeden typ danych na inny.

Przykłady:

Stream<Integer> stream = Stream.of(1, 2, 3, 4, 5);
Stream<String> stream2 = stream.map((x) -> String.valueOf(x));
Konwersja strumienia Integerna strumieńString

Funkcja, która została przekazana do metody map()jako parametr, przyjmuje liczbę xi jako wynik zwraca ciąg znaków. Nawiasem mówiąc, możesz napisać ten kod krócej:

Stream<Integer> stream = Stream.of(1, 2, 3, 4, 5);
Stream<String> stream2 = stream.map(String::valueOf);
Konwersja strumienia Integerna strumieńString

Konwertuj ciąg znaków na liczbę

Podobnie możesz napisać kod konwertujący ciąg znaków na liczbę - również nic skomplikowanego:

Stream<Integer> stream = Stream.of(1, 2, 3, 4, 5);
Stream<String> stream2 = stream.map(String::valueOf);
Stream<Integer> stream3 = stream2.map(Integer::parseInt);
Konwersja strumienia Stringna strumieńInteger

Konwertuj ciąg naURI

Operacje przekształcania danych mogą być duże i ciężkie. Powiedzmy, że chcemy przekonwertować kolekcję ciągów znaków na obiekty URI. Jest to bardzo łatwe do zrobienia, ponieważ identyfikator URI przyjmuje ciąg znaków jako parametr konstruktora.

ArrayList<String> list = new ArrayList<String>();
list.add("https://google.com");
list.add("https://linkedin.com");
list.add("https://yandex.com");

Stream<URI> stream = list.stream().map( URI::new );
Konwersja strumienia Stringna strumieńURI

Stworzyliśmy zbiór, zapisaliśmy w nim 3 linki do stron w Internecie. Następnie otrzymaliśmy obiekt z kolekcji Stream<String>i przedmiot z niej Stream<URI>. A metodzie map przekazano odniesienie do metody, która zostanie użyta do konwersji z String na URI.

Ta metoda (konstruktor) musi przyjąć typ jako parametr String. Wszystko wydaje się być idealne...


2. Wyjątki

Powyższy kod powinien działać, ale nie zadziała - program nie skompiluje się. I to nie dlatego, że gdzieś popełniliśmy błąd, ale dlatego, że popełnili go programiści Javy.

Pewnego razu wpadli na wspaniały pomysł - dodać URIsprawdzany wyjątek do konstruktora (!) klasy URISyntaxException. I takie wyjątki muszą być opakowane w try-catch.

Tak więc ostatnia linia naszego kodu będzie wyglądać następująco:

Stream<URI> stream = list.stream().map(str ->
{
  try
  {
     return new URI(str);
  }
  catch (URISyntaxException e)
  {
     e.printStackTrace();
     return null;
  }
});

Co mówisz? Musisz pomyśleć dwa razy przed użyciem sprawdzonych wyjątków . I trzykrotnie przed użyciem ich w konstruktorze.