Java Null-Safe-Streams aus Sammlungen

1. Übersicht

In diesem Tutorial erfahren Sie, wie Sie aus Java-Sammlungen null-sichere Streams erstellen.

Um dieses Material vollständig zu verstehen , müssen Sie zunächst mit den Methodenreferenzen, Lambda-Ausdrücken, der optionalen und der Stream-API von Java 8 vertraut sein .

Wenn Sie mit einem dieser Themen nicht vertraut sind, lesen Sie bitte zuerst unsere vorherigen Artikel: Neue Funktionen in Java 8, Handbuch zu Java 8 Optional und Einführung in Java 8-Streams.

2. Maven-Abhängigkeit

Bevor wir beginnen, gibt es eine Maven-Abhängigkeit, die wir für bestimmte Szenarien benötigen:

 org.apache.commons commons-collections4 4.2 

Die Bibliothek commons-collection4 kann von Maven Central heruntergeladen werden.

3. Streams aus Sammlungen erstellen

Der grundlegende Ansatz zum Erstellen eines Streams aus einem beliebigen Sammlungstyp besteht darin, die Methoden stream () oder parallelStream () für die Sammlung abhängig vom erforderlichen Stream- Typ aufzurufen :

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

Unsere Sammlung wird höchstwahrscheinlich irgendwann eine externe Quelle haben. Wir werden wahrscheinlich eine ähnliche Methode wie die folgende verwenden, wenn wir Streams aus Sammlungen erstellen:

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

Dies kann einige Probleme verursachen. Wenn die Sammelpunkte auf einen dargebotenen null Bezug, wird der Code einen wirft Nullpointer zur Laufzeit.

Der folgende Abschnitt befasst sich damit, wie wir uns davor schützen können.

4. Erstellen von Sammlungsströmen null-sicher machen

4.1. Fügen Sie Überprüfungen hinzu, um Null- Dereferenzen zu verhindern

Um unbeabsichtigte zu verhindern null Zeiger Ausnahmen, können wir entscheiden , Schecks hinzufügen zu verhindern null Verweise , wenn Ströme von Sammlungen zu erstellen:

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

Diese Methode weist jedoch einige Probleme auf.

Erstens behindert die Nullprüfung die Geschäftslogik und verringert die allgemeine Lesbarkeit des Programms.

Zweitens wird die Verwendung von Null zur Darstellung des Fehlens eines Werts als falscher Ansatz nach Java SE 8 angesehen: Es gibt eine bessere Möglichkeit, das Fehlen und Vorhandensein eines Werts zu modellieren.

Es ist wichtig zu bedenken , dass eine leere Sammlung nicht das gleiche wie eine ist null - Sammlung . Während der erste anzeigt, dass unsere Abfrage keine Ergebnisse oder Elemente zum Anzeigen enthält, schlägt der zweite vor, dass gerade während des Vorgangs eine Art Fehler aufgetreten ist.

4.2. Verwenden Sie die emptyIfNull- Methode aus der CollectionUtils- Bibliothek

Wir können die CollectionUtils- Bibliothek von Apache Commons verwenden, um sicherzustellen, dass unser Stream nullsicher ist . Diese Bibliothek bietet eine emptyIfNull Methode , die eine unveränderliche leere Auflistung eine gegebene kehrt null Sammlung als Argument oder die Sammlung selbst ansonsten:

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

Dies ist eine sehr einfache Strategie. Dies hängt jedoch von einer externen Bibliothek ab. Wenn eine Softwareentwicklungsrichtlinie die Verwendung einer solchen Bibliothek einschränkt, wird diese Lösung für null und nichtig erklärt.

4.3. Verwenden Sie optional Java 8

Optional für Java SE 8 ist ein einwertiger Container, der entweder einen Wert enthält oder nicht. Wenn ein Wert fehlt, wird der optionale Container als leer bezeichnet.

Die Verwendung von Optional kann als die beste Gesamtstrategie zum Erstellen einer null-sicheren Sammlung aus einem Stream angesehen werden.

Mal sehen, wie wir es verwenden können, gefolgt von einer kurzen Diskussion unten:

public Stream collectionToStream(Collection collection) { return Optional.ofNullable(collection) .map(Collection::stream) .orElseGet(Stream::empty); } 
  • Optional.ofNullable (Sammlung) erstellt ein optionales Objekt aus der übergebenen Sammlung. Ein leeres optionales Objekt wird erstellt, wenn die Sammlung null ist.
  • map (Collection :: stream) extrahiert den im optionalen Objektenthaltenen Wertals Argument für die map- Methode ( Collection.stream () ).
  • orElseGet (Stream :: empty) gibt den Fallback-Wert zurück, falls das optionale Objekt leer ist, dh die übergebene Auflistung ist null .

Infolgedessen schützen wir unseren Code proaktiv vor unbeabsichtigten Nullzeigerausnahmen .

4.4. Verwenden Sie den Stream OfNullable von Java 9

Untersuchen Sie unser vorheriges ternäres Beispiel in Abschnitt 4.1. und da die Möglichkeit besteht, dass einige Elemente anstelle der Sammlung null sind, steht uns die ofNullable- Methode in der Stream- Klasse zur Verfügung.

Wir können das obige Beispiel umwandeln in:

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

5. Schlussfolgerung

In diesem Artikel haben wir kurz überarbeitet, wie ein Stream aus einer bestimmten Sammlung erstellt wird. Anschließend haben wir die drei wichtigsten Strategien untersucht, um sicherzustellen, dass der erstellte Stream beim Erstellen aus einer Sammlung nullsicher ist.

Schließlich haben wir auf die Schwäche hingewiesen, jede Strategie gegebenenfalls anzuwenden.

Wie üblich ist der vollständige Quellcode, der dem Artikel beiliegt, auf GitHub verfügbar.