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));
Adatfolyam átalakítása IntegeradatfolyammáString

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);
Adatfolyam átalakítása IntegeradatfolyammáString

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);
Adatfolyam átalakítása StringadatfolyammáInteger

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 );
Adatfolyam átalakítása StringadatfolyammáURI

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 Stringargumentumké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 URIosztá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.