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));
Integer
na strumień
String
Funkcja, która została przekazana do metody map()
jako parametr, przyjmuje liczbę x
i 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);
Integer
na 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);
String
na 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 );
String
na 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ć URI
sprawdzany 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.
GO TO FULL VERSION