Java Null-Safe Streams fra samlinger

1. Oversigt

I denne vejledning ser vi, hvordan du opretter nul-sikre streams fra Java-samlinger.

Til at begynde med er noget fortrolighed med Java 8's Method Referencer, Lambda Expressions, Valgfri og Stream API kræves for at forstå dette materiale fuldt ud.

Hvis du ikke er bekendt med nogen af ​​disse emner, skal du først se på vores tidligere artikler: Nye funktioner i Java 8, Guide til Java 8 Valgfri og introduktion til Java 8 Streams.

2. Maven-afhængighed

Før vi begynder, er der en Maven-afhængighed, som vi har brug for til visse scenarier:

 org.apache.commons commons-collection4 4.2 

Det fælles-samlinger4 bibliotek kan downloades fra Maven Central.

3. Oprettelse af streams fra samlinger

Den grundlæggende tilgang til at skabe en Strøm fra enhver form for Kollektion er at kalde strøm() eller parallelStream () metoder til indsamling afhængigt af den type strøm, der kræves:

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

Vores samling vil sandsynligvis have en ekstern kilde på et tidspunkt, vi vil sandsynligvis ende med en metode, der ligner den nedenfor, når vi opretter streams fra samlinger:

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

Dette kan forårsage nogle problemer. Når den medfølgende indsamling peger på en nul reference, koden kaster en NullPointerException ved kørselstid.

Det følgende afsnit behandler, hvordan vi kan beskytte mod dette.

4. Oprettelse af oprettede samlinger er nul-sikre

4.1. Tilføj kontrol for at forhindre Nul Derferenser

For at forhindre utilsigtet nul markørundtagelser, vi kan vælge at tilføje kontrol for at forhindre nul referencer når du opretter streams fra samlinger:

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

Denne metode har dog et par problemer.

Først nul check kommer i vejen for forretningslogikken, hvilket mindsker programmets samlede læsbarhed.

For det andet brugen af nul at repræsentere fraværet af en værdi betragtes som en forkert tilgang efter Java SE 8: Der er en bedre måde at modellere fraværet og tilstedeværelsen af ​​en værdi på.

Det er vigtigt at huske, at en tom Kollektion er ikke det samme som en nulKollektion. Mens den første indikerer, at vores forespørgsel ikke har resultater eller elementer at vise, antyder den anden, at der netop er sket en slags fejl under processen.

4.2. Brug tomIfNull Metode fra CollectionUtils Bibliotek

Vi kan vælge at bruge Apache Commons ' CollectionUtils bibliotek for at sikre, at vores stream er nul sikker. Dette bibliotek giver en tomIfNull metode, der returnerer en uforanderlig tom samling givet en nul samling som argument, eller selve samlingen ellers:

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

Dette er en meget enkel strategi at vedtage. Det afhænger dog af et eksternt bibliotek. Hvis en softwareudviklingspolitik begrænser brugen af ​​et sådant bibliotek, gengives denne løsning nul og ugyldig.

4.3. Brug Java 8'er Valgfri

Java SE 8'er Valgfri er en container med en enkelt værdi, der enten indeholder en værdi eller ikke. Hvor en værdi mangler, Valgfri containeren siges at være tom.

Ved brug af Valgfri kan uden tvivl betragtes som den bedste overordnede strategi til at oprette en nul-sikker samling fra en stream.

Lad os se, hvordan vi kan bruge det efterfulgt af en hurtig diskussion nedenfor:

public Stream collectionToStream (Collection collection) {return Optional.ofNullable (collection) .map (Collection :: stream) .orElseGet (Stream :: tom); } 
  • Optional.ofNullable (samling) skaber en Valgfri objekt fra den indsendte samling. En tom Valgfri objekt oprettes, hvis samlingen er nul.
  • kort (Samling :: stream) udtrækker værdien indeholdt i Valgfri objekt som et argument for kort metode (Collection.stream ())
  • orElseGet (Stream :: tom) returnerer reserveværdien i tilfælde af, at Valgfri objektet er tomt, dvs. den indsendte samling er nul.

Som et resultat beskytter vi proaktivt vores kode mod utilsigtet nul markørundtagelser.

4.4. Brug Java 9'er StrømOfullérbar

Undersøgelse af vores tidligere ternære eksempel i afsnit 4.1. og overvejer muligheden for nogle elementer kan være nul i stedet for Kollektion, vi har til rådighed ofNullable metode i Strøm klasse.

Vi kan omdanne ovenstående prøve til:

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

5. Konklusion

I denne artikel besøgte vi kort hvordan man opretter en stream fra en given samling. Vi fortsatte derefter med at udforske de tre nøglestrategier for at sikre, at den oprettede strøm er nul-sikker, når den oprettes fra en samling.

Endelig påpegede vi svagheden ved at bruge hver strategi, hvor det var relevant.

Som sædvanlig er den fulde kildekode, der ledsager artiklen, tilgængelig på GitHub.


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