Java Null-Safe streams uit verzamelingen

1. Overzicht

In deze zelfstudie zullen we zien hoe u null-veilige streams kunt maken vanuit Java-verzamelingen.

Om te beginnen enige bekendheid met Java 8's Method References, Lambda Expressions, Optioneel en Stream API is vereist om dit materiaal volledig te begrijpen.

Als u niet bekend bent met een van deze onderwerpen, bekijk dan eerst onze vorige artikelen: Nieuwe functies in Java 8, Gids voor Java 8 optioneel en Inleiding tot Java 8-streams.

2. Maven Afhankelijkheid

Voordat we beginnen, is er één Maven-afhankelijkheid die we nodig hebben voor bepaalde scenario's:

 org.apache.commons commons-collections4 4.2 

De commons-collecties4 bibliotheek kan worden gedownload van Maven Central.

3. Creëren van streams van verzamelingen

De basisbenadering voor het maken van een Stroom van elk type Verzameling is om de stroom() of parallelStream () methoden voor de collectie, afhankelijk van het type stream dat vereist is:

Verzameling collectie = Arrays.asList ("a", "b", "c"); Stroom streamOfCollection = collection.stream (); 

Onze verzameling zal op een gegeven moment hoogstwaarschijnlijk een externe bron hebben, we zullen waarschijnlijk eindigen met een methode die vergelijkbaar is met die hieronder bij het maken van streams van verzamelingen:

openbare Stream collectionAsStream (Collectie collectie) {return collection.stream (); } 

Dit kan enkele problemen veroorzaken. Wanneer de verstrekte inzameling wijst naar een nul verwijzing, zal de code een NullPointerException tijdens runtime.

In het volgende gedeelte wordt besproken hoe we ons hiertegen kunnen beschermen.

4. Gecreëerde verzamelingsstreams nulveilig maken

4.1. Voeg controles toe om te voorkomen Nul Dereferenties

Om onbedoeld te voorkomen nul aanwijzer uitzonderingen, we kunnen ervoor kiezen om controles toe te voegen om te voorkomen nul referenties bij het maken van streams van verzamelingen:

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

Deze methode heeft echter een aantal problemen.

Eerst de nul controle staat de bedrijfslogica in de weg en vermindert de algehele leesbaarheid van het programma.

Ten tweede, het gebruik van nul de afwezigheid van een waarde vertegenwoordigen wordt beschouwd als een verkeerde benadering na Java SE 8: er is een betere manier om de afwezigheid en aanwezigheid van een waarde te modelleren.

Het is belangrijk om in gedachten te houden dat een leeg Verzameling is niet hetzelfde als een nulVerzameling. Terwijl de eerste aangeeft dat onze zoekopdracht geen resultaten of elementen bevat om weer te geven, suggereert de tweede dat er zojuist een soort fout is opgetreden tijdens het proces.

4.2. Gebruik emptyIfNull Methode van CollectionUtils Bibliotheek

We kunnen ervoor kiezen om Apache Commons te gebruiken ' CollectionUtils bibliotheek om ervoor te zorgen dat onze stream is nul veilig. Deze bibliotheek biedt een emptyIfNull methode die een onveranderlijke lege collectie teruggeeft gegeven een nul verzameling als argument, of anders de verzameling zelf:

openbare Stream collectionAsStream (verzameling verzameling) {return emptyIfNull (verzameling) .stream (); } 

Dit is een heel eenvoudige strategie om toe te passen. Het hangt echter af van een externe bibliotheek. Als een softwareontwikkelingsbeleid het gebruik van een dergelijke bibliotheek beperkt, wordt deze oplossing weergegeven nul en nietig.

4.3. Gebruik Java 8's Optioneel

Java SE 8's Optioneel is een container met één waarde die een waarde bevat of niet. Als een waarde ontbreekt, is de Optioneel container zou leeg zijn.

Gebruik makend van Optioneel kan worden beschouwd als de beste algemene strategie om een ‚Äč‚Äčnulveilige verzameling van een stream te maken.

Laten we eens kijken hoe we het kunnen gebruiken, gevolgd door een korte bespreking hieronder:

openbare Stream collectionToStream (verzameling verzameling) {return Optioneel.ofNullable (verzameling) .map (verzameling :: stream) .orElseGet (Stream :: leeg); } 
  • Optioneel.ofNullable (verzameling) creëert een Optioneel object uit de ingeleverde collectie. Een lege Optioneel object wordt gemaakt als de collectie dat is nul.
  • map (Collectie :: stream) extraheert de waarde in het Optioneel object als argument voor de kaart methode (Collectie.stream ())
  • orElseGet (stream :: leeg) geeft de fallback-waarde terug in het geval dat de Optioneel object is leeg, d.w.z. de doorgegeven collectie is nul.

Als gevolg hiervan beschermen we onze code proactief tegen onbedoeld nul pointer uitzonderingen.

4.4. Gebruik Java 9's StroomOfNullable

We bespreken ons vorige ternaire voorbeeld in paragraaf 4.1. en het overwegen van de mogelijkheid van sommige elementen zou kunnen zijn nul in plaats van de Verzamelinghebben we de beschikking over de ofNullable methode in de Stroom klasse.

We kunnen het bovenstaande voorbeeld transformeren naar:

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

5. Conclusie

In dit artikel hebben we kort opnieuw bekeken hoe u een stream van een bepaalde verzameling kunt maken. Vervolgens hebben we de drie belangrijkste strategieën onderzocht om ervoor te zorgen dat de gemaakte stream nulveilig is wanneer deze op basis van een verzameling wordt gemaakt.

Ten slotte hebben we gewezen op de zwakte van het gebruik van elke strategie waar relevant.

Zoals gewoonlijk is de volledige broncode die bij het artikel hoort, beschikbaar op GitHub.