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));
Funktionsargumentet som skickas till map()
metoden tar ett tal x
och 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 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 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 );
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 String
som 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 ( ) URISyntaxException
till URI
klasskonstruktorn! 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.
GO TO FULL VERSION