Java Null-Safe Streams fra samlinger

1. Oversikt

I denne opplæringen vil vi se hvordan du oppretter null-sikre strømmer fra Java-samlinger.

Til å begynne med litt kjennskap til Java 8s metodehenvisninger, Lambda Expressions, Valgfri og Stream API kreves for å forstå dette materialet.

Hvis du ikke er kjent med noen av disse emnene, kan du ta en titt på våre tidligere artikler først: Nye funksjoner i Java 8, Guide til Java 8 Valgfritt og introduksjon til Java 8 Streams.

2. Maven avhengighet

Før vi begynner, er det en Maven-avhengighet som vi trenger for visse scenarier:

 org.apache.commons commons-collection4 4.2 

De felles-samlinger4 biblioteket kan lastes ned fra Maven Central.

3. Opprette bekker fra samlinger

Den grunnleggende tilnærmingen til å skape en Strøm fra alle typer Samling er å ringe strøm() eller parallelStream () metoder på samlingen avhengig av hvilken type strøm som kreves:

Samlingssamling = Arrays.asList ("a", "b", "c"); Stream streamOfCollection = collection.stream (); 

Samlingen vår vil mest sannsynlig ha en ekstern kilde på et tidspunkt, vi vil sannsynligvis ende opp med en metode som ligner på den nedenfor når vi oppretter strømmer fra samlinger:

public Stream collectionAsStream (Collection collection) {return collection.stream (); } 

Dette kan føre til noen problemer. Når den medfølgende samlingen peker på en null referanse, koden vil kaste a NullPointerException ved kjøretid.

Følgende avsnitt tar for seg hvordan vi kan beskytte mot dette.

4. Å lage opprettet samling strømmer null-safe

4.1. Legg til sjekker for å forhindre Null Dereferanser

For å forhindre utilsiktet null pekere unntak, vi kan velge å legge til sjekker for å forhindre null referanser når du oppretter strømmer fra samlinger:

Stream collectionAsStream (Collection collection) {return collection == null? Stream.empty (): collection.stream (); } 

Denne metoden har imidlertid et par problemer.

Først, den null sjekk kommer i veien for forretningslogikken som reduserer den totale lesbarheten til programmet.

For det andre, bruken av null å representere fraværet av en verdi betraktes som en feil tilnærming etter Java SE 8: Det er en bedre måte å modellere fraværet og tilstedeværelsen av en verdi på.

Det er viktig å huske på at en tom Samling er ikke det samme som en nullSamling. Mens den første indikerer at forespørselen vår ikke har resultater eller elementer å vise, antyder den andre at det bare skjedde en slags feil under prosessen.

4.2. Bruk tomIfNull Metode fra CollectionUtils Bibliotek

Vi kan velge å bruke Apache Commons ' CollectionUtils biblioteket for å sikre at strømmen vår er null sikker. Dette biblioteket gir en tomIfNull metode som returnerer en uforanderlig tom samling gitt en null samling som argument, eller selve samlingen ellers:

public Stream collectionAsStream (Collection collection) {return emptyIfNull (collection) .stream (); } 

Dette er en veldig enkel strategi å vedta. Det avhenger imidlertid av et eksternt bibliotek. Hvis en policy for programvareutvikling begrenser bruken av et slikt bibliotek, blir denne løsningen gjengitt null og ugyldig.

4.3. Bruk Java 8-er Valgfri

Java SE 8-er Valgfri er en container med en verdi som enten inneholder en verdi eller ikke. Der en verdi mangler, blir Valgfri containeren sies å være tom.

Ved hjelp av Valgfri kan uten tvil betraktes som den beste overordnede strategien for å lage en null-trygg samling fra en strøm.

La oss se hvordan vi kan bruke den etterfulgt av en rask diskusjon nedenfor:

public Stream collectionToStream (Collection collection) {return Optional.ofNullable (collection) .map (Collection :: stream) .orElseGet (Stream :: tom); } 
  • Valgfritt.avNullable (samling) skaper en Valgfri objekt fra den innsendte samlingen. En tom Valgfri objekt opprettes hvis samlingen er null.
  • kart (Samling :: stream) trekker ut verdien som finnes i Valgfri objekt som et argument for kart metode (Collection.stream ())
  • orElseGet (Stream :: tom) returnerer reserveverdien i tilfelle at Valgfri objektet er tomt, dvs. den innsendte samlingen er null.

Som et resultat beskytter vi koden vår mot utilsiktet null pekere unntak.

4.4. Bruk Java 9-er StrømOfullstendig

Undersøkelse av vårt forrige ternære eksempel i avsnitt 4.1. og vurderer muligheten for noen elementer kan være null i stedet for Samling, vi har til rådighet avNullable metoden i Strøm klasse.

Vi kan transformere eksemplet ovenfor til:

Stream collectionAsStream (Collection collection) {return collection.stream (). FlatMap (s -> Stream.ofNullable (s)); }

5. Konklusjon

I denne artikkelen gikk vi kort over hvordan du oppretter en strøm fra en gitt samling. Deretter fortsatte vi med å utforske de tre viktigste strategiene for å sikre at den opprettede strømmen er null-sikker når den er opprettet fra en samling.

Til slutt påpekte vi svakheten ved å bruke hver strategi der det var relevant.

Som vanlig er den fullstendige kildekoden som følger med artikkelen tilgjengelig på GitHub.


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