A „Stream már működtetett vagy bezárt” kivétel a Java-ban

1. Áttekintés

Ebben a rövid cikkben egy közöset fogunk megvitatni Kivétel hogy találkozhatunk a Folyam osztály Java 8-ban:

IllegalStateException: az adatfolyamot már üzemeltették vagy lezárták.

Felfedezzük a forgatókönyveket, amikor ez a kivétel bekövetkezik, és az elkerülésének lehetséges módjait, gyakorlati példákkal együtt.

2. Az ok

Java 8-ban mindegyik Folyam osztály egyszer használatos adatszekvenciát képvisel, és több I / O műveletet támogat.

A Folyam csak egyszer kell működtetni (közbenső vagy végberendezési folyamattól függően). A Stream implementáció dobhat IllegalStateException ha észleli, hogy a Folyam újrafelhasználásra kerül.

Amikor egy terminálműveletet hívnak meg a Folyam objektum, a példány elfogyasztásra kerül és bezáródik.

Ebből kifolyólag, csak egyetlen műveletet hajthatunk végre, amely a Folyam, különben kapunk egy kivételt, amely kimondja, hogy a Folyam már megoperálták vagy bezárták.

Nézzük meg, hogyan lehet ezt lefordítani egy gyakorlati példára:

Stream stringStream = Stream.of ("A", "B", "C", "D"); Opcionális eredmény1 = stringStream.findAny (); System.out.println (result1.get ()); Választható eredmény2 = stringStream.findFirst ();

Ennek eredményeként:

Kivétel a "main" szálban java.lang.IllegalStateException: a stream már működött vagy bezárt

Azután #findAny () metódusra hivatkozik, a stringStream zárt, ezért minden további művelet a Folyam dobni fogja a IllegalStateException, és ez történt a #findFirst () módszer.

3. A megoldás

Egyszerűen fogalmazva: a megoldás egy új létrehozásából áll Folyam valahányszor szükségünk van egyet.

Természetesen megtehetjük ezt manuálisan is, de ott a Támogató a funkcionális felület valóban praktikus lesz:

Támogató streamSupplier = () -> Stream.of ("A", "B", "C", "D"); Opcionális eredmény1 = streamSupplier.get (). FindAny (); System.out.println (result1.get ()); Opcionális eredmény2 = streamSupplier.get (). FindFirst (); System.out.println (result2.get ());

Ennek eredményeként:

A A

Meghatároztuk a streamSupplier objektum a típussal Folyam, amely pontosan ugyanolyan típusú, mint a #kap() metódus visszatér. A Támogató egy lambda kifejezésen alapul, amely nem vesz be adatbevitelt, és újat ad vissza Folyam.

A funkcionális módszer meghívása kap() a Támogató frissen létrehozottat ad vissza Folyam tárgy, amelyen biztonságosan elvégezhetünk egy másikat Folyam művelet.

5. Következtetés

Ebben a gyors oktatóanyagban láthattuk, hogyan kell végrehajtani a terminál műveleteket a Folyam többször, elkerülve a híreseket IllegalStateException hogy dobják, amikor a Folyam már le van zárva vagy üzemeltetik.

A cikk teljes forráskódját és összes kódrészletét a GitHubon találja meg.


$config[zx-auto] not found$config[zx-overlay] not found