1. Преобразуване на данни

Класът Stream<T>също има метод, който ви позволява да конвертирате данни от един тип в друг. Този метод е map().

Той също връща поток, но с елементи от различен тип. Методът map()приема като аргумент на метод функция, която преобразува един тип данни в друг.

Примери:

Stream<Integer> stream = Stream.of(1, 2, 3, 4, 5);
Stream<String> stream2 = stream.map((x) -> String.valueOf(x));
Преобразуване на Integerпоток в Stringпоток

Аргументът на функцията, подаден на map()метода, приема число xи връща низовото му представяне. Между другото, можете да напишете този code по-компактно:

Stream<Integer> stream = Stream.of(1, 2, 3, 4, 5);
Stream<String> stream2 = stream.map(String::valueOf);
Преобразуване на Integerпоток в Stringпоток

Преобразуване на низ в число

По същия начин можете да напишете 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);
Преобразуване на Stringпоток в Integerпоток

Преобразуване на низ в 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 );
Преобразуване на Stringпоток в URIпоток

Създадохме колекция и я попълнихме с 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во можем да кажем Трябва да помислите два пъти, преди да използвате проверено изключение . И помислете три пъти преди да ги използвате в конструктор.