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.