1. Conversia datelor

Clasa Stream<T>are, de asemenea, o metodă care vă permite să convertiți datele de la un tip la altul. Această metodă este map().

De asemenea, returnează un flux, dar cu elemente de alt tip. Metoda map()ia ca argument de metodă o funcție care convertește un tip de date în altul.

Exemple:

Stream<Integer> stream = Stream.of(1, 2, 3, 4, 5);
Stream<String> stream2 = stream.map((x) -> String.valueOf(x));
Transformarea unui Integerflux într-un Stringflux

Argumentul funcției transmis metodei map()ia un număr xși returnează reprezentarea lui șir. Apropo, puteți scrie acest cod mai compact:

Stream<Integer> stream = Stream.of(1, 2, 3, 4, 5);
Stream<String> stream2 = stream.map(String::valueOf);
Transformarea unui Integerflux într-un Stringflux

Transformarea unui șir într-un număr

În mod similar, puteți scrie cod pentru a converti un șir într-un număr - nici acest lucru nu este complicat:

Stream<Integer> stream = Stream.of(1, 2, 3, 4, 5);
Stream<String> stream2 = stream.map(String::valueOf);
Stream<Integer> stream3 = stream2.map(Integer::parseInt);
Transformarea unui Stringflux într-un Integerflux

Convertirea unui șir în aURI

Operațiunile de conversie a datelor pot necesita resurse și timp. Să presupunem că vrem să convertim o colecție de șiruri de caractere în obiecte URI. Acest lucru este foarte ușor de făcut, deoarece constructorul URI ia un șir ca argument.

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 );
Transformarea unui Stringflux într-un URIflux

Am creat o colecție și am populat-o cu 3 adrese web. Apoi am luat un Stream<String>obiect din colecție și, la rândul nostru, din acel flux am luat un Stream<URI>obiect. Am transmis metodei map o referință la metoda care va fi folosită pentru a converti fiecare șir într-un URI.

Această metodă (constructor) trebuie să ia a Stringca argument. Totul pare a fi perfect...


2. Excepții

Ne-am putea aștepta ca codul de mai sus să funcționeze, dar nu va funcționa - programul nu se va compila. Și nu pentru că am greșit undeva, ci pentru că creatorii lui Java s-au încurcat.

Cândva, au avut ideea genială de a adăuga o excepție bifată ( URISyntaxException) la URIconstructorul clasei! Și astfel de excepții trebuie să fie înfășurate într-un try-catch.

Deci ultima linie a codului nostru va arăta astfel:

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

Ce putem spune? Ar trebui să vă gândiți de două ori înainte de a utiliza o excepție bifată . Și gândiți-vă de trei ori înainte de a le folosi într-un constructor.