Bezárnunk kellene egy Java-adatfolyamot?

1. Áttekintés

A lambda kifejezések Java 8-ban történő bevezetésével tömörebb és funkcionálisabb módon lehet kódot írni. A Java platform ezen forradalmi változásának középpontjában az adatfolyamok és a funkcionális interfészek állnak.

Ebben a gyors bemutatóban megtudhatjuk, hogy az erőforrás szemszögéből nézve kell-e kifejezetten bezárnunk a Java 8 folyamokat.

2. Záró folyamok

A Java 8 folyamok valósítják meg a Automatikusan zárható felület:

nyilvános felületű adatfolyam kiterjeszti a BaseStream-et {// kihagyott} nyilvános felület

Leegyszerűsítve: a folyamokra kell gondolnunk, mint olyan forrásokra, amelyeket kölcsön tudunk adni és visszatérhetünk, ha ezzel végzünk. A legtöbb erőforrással ellentétben nem kell mindig bezárnunk az adatfolyamokat.

Ez elsőre ellentmondóan hangozhat, ezért nézzük meg, mikor kell és mikor nem szabad bezárnunk a Java 8 folyamokat.

2.1. Gyűjtemények, tömbök és generátorok

Legtöbbször mi alkotunk Folyam példányok a Java gyűjteményekből, tömbökből vagy generátorfunkciókból. Például itt a Húr a Stream API-n keresztül:

Lista színei = List.of ("Piros", "Kék", "Zöld") .stream () .filter (c -> c.length ()> 4) .map (String :: toUpperCase) .collect (Collectors. toList ());

Néha véges vagy végtelen szekvenciális adatfolyamot állítunk elő:

Véletlenszerű véletlenszerű = új Véletlenszerű (); random.ints (). takeWhile (i -> i <1000) .forEach (System.out :: println);

Emellett használhatunk tömb alapú folyamokat is:

Karakterlánc [] színek = {"Piros", "Kék", "Zöld"}; Tömbök.stream (színek). Térkép (String :: toUpperCase) .toArray ()

Amikor ilyen típusú folyamokkal foglalkozunk, nem szabad azokat kifejezetten bezárnunk. Az egyetlen értékes erőforrás, amely ezekhez az adatfolyamokhoz kapcsolódik, a memória, és erről a Garbage Collection (GC) gondoskodik.

2.2. IO Resources

Néhány adatfolyamot azonban IO erőforrások, például fájlok vagy socketek támogatnak. Például a Files.lines () metódus az adott fájl összes sorát streameli:

Files.lines (Paths.get ("/ path / to / file")) .flatMap (sor -> Arrays.stream (line.split (","))) // kihagyva

A motorháztető alatt ez a módszer megnyitja a FileChannel például a patak bezárásakor bezárja. Ebből kifolyólag, ha elfelejtjük bezárni az adatfolyamot, az alapul szolgáló csatorna nyitva marad, és akkor erőforrás-szivárgással járunk.

Az ilyen erőforrások szivárgásának megakadályozása érdekében erősen ajánlott a erőforrásokkal próbálkozzon szólás az IO-alapú folyamok bezárására:

próbálkozzon (Streams = Files.lines (Paths.get ("/ path / to / file"))) {lines.flatMap (line -> Arrays.stream (line.split (","))) // kihagyva}

Így a fordító automatikusan bezárja a csatornát. A legfontosabb elvitel itt az összes IO-alapú adatfolyam bezárása.

Felhívjuk figyelmét, hogy egy már bezárt patak bezárása dobhat IllegalStateException.

3. Következtetés

Ebben a rövid bemutatóban láttuk a különbségeket az egyszerű és az IO-nehéz folyamok között. Megtudtuk azt is, hogy ezek a különbségek hogyan hatnak arra a döntésünkre, hogy bezárjuk-e a Java 8-streameket.

Szokás szerint a mintakód elérhető a GitHubon.