"Stream er allerede operert eller lukket" Unntak i Java

1. Oversikt

I denne korte artikkelen skal vi diskutere en felles Unntak som vi kan støte på når vi jobber med Strøm klasse i Java 8:

IllegalStateException: stream har allerede blitt operert eller stengt.

Vi vil oppdage scenariene når dette unntaket oppstår, og mulige måter å unngå det, sammen med praktiske eksempler.

2. Årsaken

I Java 8, hver Strøm klasse representerer en engangssekvens med data og støtter flere I / O-operasjoner.

EN Strøm skal kun brukes (påkalle en mellom- eller terminalstrømoperasjon) en gang. En Stream-implementering kan kaste IllegalStateException hvis den oppdager at Strøm blir gjenbrukt.

Når en terminaloperasjon kalles på en Strøm objekt, blir forekomsten fortært og lukket.

Derfor, vi har bare lov til å utføre en enkelt operasjon som bruker a Strøm, Ellers får vi et unntak som sier at Strøm har allerede blitt operert eller stengt.

La oss se hvordan dette kan oversettes til et praktisk eksempel:

Stream stringStream = Stream.of ("A", "B", "C", "D"); Valgfritt resultat1 = stringStream.findAny (); System.out.println (result1.get ()); Valgfritt resultat2 = stringStream.findFirst ();

Som et resultat:

Et unntak i tråden "hoved" java.lang.IllegalStateException: strømmen er allerede operert eller lukket

Etter #findAny () metoden påberopes, stringStream er derfor stengt, enhver videre operasjon på Strøm vil kaste IllegalStateException, og det var det som skjedde etter å ha påkalt #findFirst () metode.

3. Løsningen

Enkelt sagt består løsningen i å lage en ny Strøm hver gang vi trenger en.

Vi kan selvfølgelig gjøre det manuelt, men det er der Leverandør funksjonelt grensesnitt blir veldig praktisk:

Leverandør streamSupplier = () -> Stream.of ("A", "B", "C", "D"); Valgfritt resultat1 = streamSupplier.get (). FindAny (); System.out.println (result1.get ()); Valgfritt resultat2 = streamSupplier.get (). FindFirst (); System.out.println (result2.get ());

Som et resultat:

A A

Vi har definert streamSupplier objekt med typen Strøm, som er nøyaktig samme type som #få() metoden returnerer. De Leverandør er basert på et lambdauttrykk som ikke tar noen innspill og returnerer et nytt Strøm.

Påkaller den funksjonelle metoden få()Leverandør returnerer en nyopprettet Strøm objekt som vi trygt kan utføre en annen på Strøm operasjon.

5. Konklusjon

I denne raske opplæringen har vi sett hvordan du kan utføre terminaloperasjoner på en Strøm flere ganger, mens du unngår den berømte IllegalStateException som kastes når Strøm er allerede stengt eller operert.

Du kan finne den komplette kildekoden og alle kodebiter for denne artikkelen på GitHub.


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