1. Adatkonverzió
Az Stream<T>
osztálynak van egy metódusa is, amely lehetővé teszi az adatok egyik típusból a másikba való konvertálását. Ez a módszer az map()
.
Ez is egy adatfolyamot ad vissza, de más típusú elemekkel. A map()
metódus metódus-argumentumként egy olyan függvényt vesz fel, amely az egyik adattípust egy másikra konvertálja.
Példák:
Stream<Integer> stream = Stream.of(1, 2, 3, 4, 5);
Stream<String> stream2 = stream.map((x) -> String.valueOf(x));
A map()
metódusnak átadott függvény argumentum egy számot vesz fel x
, és visszaadja a karakterlánc reprezentációját. Egyébként ezt a kódot tömörebben is megírhatod:
Stream<Integer> stream = Stream.of(1, 2, 3, 4, 5);
Stream<String> stream2 = stream.map(String::valueOf);
Karakterlánc átalakítása számmá
Hasonlóképpen kódot írhat egy karakterlánc számmá alakításához – ez szintén nem bonyolult:
Stream<Integer> stream = Stream.of(1, 2, 3, 4, 5);
Stream<String> stream2 = stream.map(String::valueOf);
Stream<Integer> stream3 = stream2.map(Integer::parseInt);
Karakterlánc konvertálása aURI
Az adatátalakítási műveletek erőforrás- és időigényesek lehetnek. Tegyük fel, hogy egy karakterlánc-gyűjteményt szeretnénk átalakítani URI objektumokká. Ezt nagyon könnyű megtenni, mert az URI konstruktor egy karakterláncot vesz fel argumentumként.
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 );
Létrehoztunk egy gyűjteményt és feltöltöttük 3 webcímmel. Aztán kaptunk egy Stream<String>
tárgyat a gyűjteményből, és viszont abból a patakból kaptunk egy Stream<URI>
tárgyat. A leképezési metódusnak átadtunk egy hivatkozást arra a metódusra, amelyet az egyes karakterláncok URI-vé alakítására használunk.
Ennek a metódusnak (konstruktornak) a-t kell vennie String
argumentumként. Minden tökéletesnek tűnik...
2. Kivételek
Arra számíthatunk, hogy a fenti kódnak működnie kell, de nem fog – a program nem fog lefordítani. És nem azért, mert valahol hibáztunk, hanem mert a Java készítői elrontották.
Valamikor régen az a zseniális ötletük támadt, hogy egy ellenőrzött kivételt ( URISyntaxException
) adjanak hozzá az URI
osztálykonstruktorhoz! És az ilyen kivételeket egy try-catch
.
Tehát a kódunk utolsó sora így fog kinézni:
Stream<URI> stream = list.stream().map(str ->
{
try
{
return new URI(str);
}
catch (URISyntaxException e)
{
e.printStackTrace();
return null;
}
});
Mit mondhatunk? Kétszer meg kell gondolnia, mielőtt bejelölt kivételt használna . És gondolja át háromszor, mielőtt konstruktorban használná őket.
GO TO FULL VERSION