“Stream er allerede blevet betjent eller lukket” Undtagelse i Java

1. Oversigt

I denne korte artikel skal vi diskutere et fælles Undtagelse som vi kan støde på, når vi arbejder med Strøm klasse i Java 8:

IllegalStateException: stream er allerede blevet betjent eller lukket.

Vi opdager scenarierne, når denne undtagelse opstår, og de mulige måder at undgå den sammen med praktiske eksempler.

2. Årsagen

I Java 8 hver Strøm klasse repræsenterer en engangssekvens af data og understøtter flere I / O-operationer.

EN Strøm skal kun betjenes (påberåbt en mellemliggende eller terminalstrømoperation) en gang. En Stream-implementering kan kaste IllegalStateException hvis det opdager, at Strøm bliver genbrugt.

Hver gang en terminaloperation kaldes på en Strøm objekt, forekomsten bliver fortæret og lukket.

Derfor, vi har kun lov til at udføre en enkelt operation, der bruger en Strøm, Ellers får vi en undtagelse, der siger, at Strøm er allerede blevet opereret eller lukket.

Lad os se, hvordan dette kan oversættes til et praktisk eksempel:

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

Som resultat:

En undtagelse i tråden "main" java.lang.IllegalStateException: stream er allerede blevet betjent eller lukket

Efter #findAny () metode påberåbes, strengStream er lukket, derfor er enhver yderligere operation på Strøm vil kaste IllegalStateException, og det er hvad der skete efter påberåbelse af #findFirst () metode.

3. Løsningen

Enkelt sagt består løsningen i at skabe et nyt Strøm hver gang vi har brug for en.

Vi kan selvfølgelig gøre det manuelt, men det er her Leverandør funktionel grænseflade bliver virkelig praktisk:

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

Som resultat:

A A

Vi har defineret streamSupplier objekt med typen Strøm, som er nøjagtig den samme type som #få() metoden vender tilbage. Det Leverandør er baseret på et lambda-udtryk, der ikke tager noget input og returnerer et nyt Strøm.

Påberåbe sig den funktionelle metode få() på den Leverandør returnerer en frisk oprettet Strøm objekt, hvorpå vi sikkert kan udføre en anden Strøm operation.

5. Konklusion

I denne hurtige vejledning har vi set, hvordan man udfører terminaloperationer på en Strøm flere gange, mens man undgår det berømte IllegalStateException der kastes, når Strøm er allerede lukket eller opereret.

Du kan finde den komplette kildekode og alle kodestykker til denne artikel på GitHub.


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