1. Преобразуване на данни
Класът Stream<T>
също има метод, който ви позволява да конвертирате данни от един тип в друг. Този метод е map()
.
Той също връща поток, но с елементи от различен тип. Методът map()
приема като аргумент на метод функция, която преобразува един тип данни в друг.
Примери:
Stream<Integer> stream = Stream.of(1, 2, 3, 4, 5);
Stream<String> stream2 = stream.map((x) -> String.valueOf(x));
Аргументът на функцията, подаден на map()
метода, приема число x
и връща низовото му представяне. Между другото, можете да напишете този code по-компактно:
Stream<Integer> stream = Stream.of(1, 2, 3, 4, 5);
Stream<String> stream2 = stream.map(String::valueOf);
Преобразуване на низ в число
По същия начин можете да напишете code за преобразуване на низ в число - това също не е сложно:
Stream<Integer> stream = Stream.of(1, 2, 3, 4, 5);
Stream<String> stream2 = stream.map(String::valueOf);
Stream<Integer> stream3 = stream2.map(Integer::parseInt);
Преобразуване на низ в aURI
Операциите по преобразуване на данни могат да изискват ресурси и време. Да кажем, че искаме да конвертираме колекция от низове в URI обекти. Това се прави много лесно, защото URI конструкторът приема низ като аргумент.
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 );
Създадохме колекция и я попълнихме с 3 уеб address. След това получихме Stream<String>
обект от колекцията и на свой ред от този поток получихме обект Stream<URI>
. Предадохме на метода map препратка към метода, който ще се използва за преобразуване на всеки низ в URI.
Този метод (конструктор) трябва да приема String
като аргумент. Всичко изглежда перфектно...
2. Изключения
Може да очакваме, че горният code трябва да работи, но няма да стане — програмата няма да се компorра. И не защото сме сгрешor някъде, а защото създателите на Java са се объркали.
Имало едно време им хрумнала брилянтната идея да добавят проверено изключение ( URISyntaxException
) към URI
конструктора на класа! И такива изключения трябва да бъдат опаковани в try-catch
.
Последният ред от нашия code ще изглежда така:
Stream<URI> stream = list.stream().map(str ->
{
try
{
return new URI(str);
}
catch (URISyntaxException e)
{
e.printStackTrace();
return null;
}
});
Howво можем да кажем Трябва да помислите два пъти, преди да използвате проверено изключение . И помислете три пъти преди да ги използвате в конструктор.
GO TO FULL VERSION