"Stream je već operiran ili zatvoren" izuzetak na Javi

1. Pregled

U ovom kratkom članku razgovarat ćemo o zajedničkom Iznimka s kojim se možemo susresti u radu s Stream klasa u Javi 8:

IllegalStateException: stream je već operiran ili zatvoren.

Otkrivat ćemo scenarije kada se dogodi ova iznimka i moguće načine za njezino izbjegavanje, zajedno sa praktičnim primjerima.

2. Uzrok

U Javi 8 svaki Stream klasa predstavlja jednokratni slijed podataka i podržava nekoliko I / O operacija.

A Stream treba operirati (pozivajući se na operaciju srednjeg ili terminalnog toka) samo jednom. Implementacija streama može baciti IllegalStateException ako otkrije da je Stream se ponovno koristi.

Kad god se operacija terminala pozove na Stream objekta, instanca se troši i zatvara.

Stoga, smijemo izvesti samo jednu operaciju koja troši a Stream, u suprotnom, dobit ćemo iznimku koja kaže da Stream je već operiran ili zatvoren.

Pogledajmo kako se to može prevesti na praktični primjer:

Stream stringStream = Stream.of ("A", "B", "C", "D"); Izborni rezultat1 = stringStream.findAny (); System.out.println (result1.get ()); Izborni rezultat2 = stringStream.findFirst ();

Kao rezultat:

Iznimka u niti "main" java.lang.IllegalStateException: stream je već operiran ili zatvoren

Nakon što #findAny () poziva se metoda, stringStream je zatvoren, dakle, svaka daljnja operacija na Stream bacit će IllegalStateException, i to se dogodilo nakon poziva na #findFirst () metoda.

3. Rješenje

Jednostavno rečeno, rješenje se sastoji u stvaranju novog Stream svaki put kad nam treba.

To možemo, naravno, ručno, ali tu je Dobavljač funkcionalno sučelje postaje vrlo praktično:

Dobavljač streamSupplier = () -> Stream.of ("A", "B", "C", "D"); Izborni rezultat1 = streamSupplier.get (). FindAny (); System.out.println (result1.get ()); Izborni rezultat2 = streamSupplier.get (). FindFirst (); System.out.println (result2.get ());

Kao rezultat:

A A

Mi smo definirali streamSupplier objekt s vrstom Stream, koji je potpuno isti tip kao i #dobiti() metoda se vraća. The Dobavljač temelji se na lambda izrazu koji ne uzima ulaz i vraća novi Stream.

Pozivanje na funkcionalnu metodu dobiti() na Dobavljač vraća svježe stvoreno Stream objekt, na kojem možemo sigurno izvesti drugi Stream operacija.

5. Zaključak

U ovom smo brzom vodiču vidjeli kako izvoditi operacije terminala na a Stream više puta, istodobno izbjegavajući poznato IllegalStateException koji se baca kad Stream je već zatvorena ili operirana.

Kompletni izvorni kod i sve isječke koda za ovaj članak možete pronaći na GitHubu.


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