1. Datakonvertering

Klassen Stream<T>har også en metode som lar deg konvertere data fra en type til en annen. Denne metoden er map().

Den returnerer også en strøm, men med elementer av en annen type. Metoden map()tar som et metodeargument en funksjon som konverterer en datatype til en annen.

Eksempler:

Stream<Integer> stream = Stream.of(1, 2, 3, 4, 5);
Stream<String> stream2 = stream.map((x) -> String.valueOf(x));
Konvertere en Integerstrøm til en Stringstrøm

Funksjonsargumentet som sendes til map()metoden tar et tall xog returnerer strengrepresentasjonen. Forresten, du kan skrive denne koden mer kompakt:

Stream<Integer> stream = Stream.of(1, 2, 3, 4, 5);
Stream<String> stream2 = stream.map(String::valueOf);
Konvertere en Integerstrøm til en Stringstrøm

Konvertere en streng til et tall

På samme måte kan du skrive kode for å konvertere en streng til et tall - dette er heller ikke komplisert:

Stream<Integer> stream = Stream.of(1, 2, 3, 4, 5);
Stream<String> stream2 = stream.map(String::valueOf);
Stream<Integer> stream3 = stream2.map(Integer::parseInt);
Konvertere en Stringstrøm til en Integerstrøm

Konvertere en streng til enURI

Datakonverteringsoperasjoner kan være ressurs- og tidskrevende. La oss si at vi ønsker å konvertere en samling strenger til URI-objekter. Dette er veldig enkelt å gjøre, fordi URI-konstruktøren tar en streng som et 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 );
Konvertere en Stringstrøm til en URIstrøm

Vi opprettet en samling og fylte den med 3 nettadresser. Så fikk vi en Stream<String>gjenstand fra samlingen, og i sin tur fra den bekken fikk vi en Stream<URI>gjenstand. Vi ga kartmetoden en referanse til metoden som skal brukes til å konvertere hver streng til en URI.

Denne metoden (konstruktøren) må ta a Stringsom et argument. Alt ser ut til å være perfekt...


2. Unntak

Vi kan forvente at koden ovenfor skal fungere, men den vil ikke - programmet vil ikke kompilere. Og ikke fordi vi gjorde en feil et sted, men fordi Javas skapere rotet til.

En gang i tiden hadde de den geniale ideen om å legge til et avkrysset unntak ( URISyntaxException) til URIklassekonstruktøren! Og slike unntak må pakkes inn i en try-catch.

Så den siste linjen i koden vår vil se slik ut:

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

Hva kan vi si? Du bør tenke deg om to ganger før du bruker et avkrysset unntak . Og tenk tre ganger før du bruker dem i en konstruktør.