1. Datakonvertering

Klassen Stream<T>har också en metod som låter dig konvertera data från en typ till en annan. Denna metod är map().

Den returnerar också en ström, men med element av en annan typ. Metoden map()tar som ett metodargument en funktion som konverterar en datatyp till en annan.

Exempel:

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

Funktionsargumentet som skickas till map()metoden tar ett tal xoch returnerar dess strängrepresentation. Förresten, du kan skriva den här koden mer kompakt:

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

Konvertera en sträng till ett tal

På samma sätt kan du skriva kod för att konvertera en sträng till ett tal - det här är inte heller komplicerat:

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

Konvertera en sträng till enURI

Datakonverteringsoperationer kan vara resurskrävande och tidskrävande. Låt oss säga att vi vill konvertera en samling strängar till URI-objekt. Detta är mycket enkelt att göra, eftersom URI-konstruktorn tar en sträng som ett 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 );
Konvertera en Stringström till en URIström

Vi skapade en samling och fyllde den med 3 webbadresser. Sedan fick vi ett Stream<String>föremål från samlingen, och i sin tur från den strömmen fick vi ett Stream<URI>föremål. Vi skickade kartmetoden en referens till metoden som kommer att användas för att konvertera varje sträng till en URI.

Denna metod (konstruktör) måste ta a Stringsom ett argument. Allt verkar vara perfekt...


2. Undantag

Vi kan förvänta oss att koden ovan ska fungera, men det kommer den inte att göra – programmet kompilerar inte. Och inte för att vi gjorde ett misstag någonstans, utan för att Javas skapare trasslade till.

En gång i tiden hade de den briljanta idén att lägga till ett markerat undantag ( ) URISyntaxExceptiontill URIklasskonstruktorn! Och sådana undantag måste lindas in i en try-catch.

Så den sista raden i vår kod kommer att se ut så här:

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

Vad kan vi säga? Du bör tänka två gånger innan du använder ett markerat undantag . Och tänk efter tre gånger innan du använder dem i en konstruktor.