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));
Funksjonsargumentet som sendes til map()
metoden tar et tall x
og 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 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 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 );
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 String
som 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 URI
klassekonstruktø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.
GO TO FULL VERSION