Ich habe eine Liste von Objekten sagen car
. Ich möchte diese Liste basierend auf einigen Parametern mit Java 8 filtern. Wenn der Parameter jedoch lautet null
, wird er ausgelöst NullPointerException
. Wie filtere ich Nullwerte heraus?
Der aktuelle Code lautet wie folgt
requiredCars = cars.stream().filter(c -> c.getName().startsWith("M"));
Dies wirft, NullPointerException
wenn getName()
zurückgegeben wird null
.
Antworten:
In diesem speziellen Beispiel denke ich, dass @Tagir 100% korrekt ist. Holen Sie es in einen Filter und führen Sie die beiden Überprüfungen durch. Ich würde
Optional.ofNullable
das optionale Zeug nicht verwenden, damit Rückgabetypen keine Logik ausführen ... aber wirklich weder hier noch dort.Ich wollte darauf hinweisen, dass
java.util.Objects
dies in einem breiten Fall eine gute Methode dafür ist, also können Sie dies tun:Dadurch werden Ihre Nullobjekte gelöscht. Für alle, die nicht vertraut sind, ist dies die Abkürzung für Folgendes:
Um die vorliegende Frage teilweise zu beantworten und die Liste der Fahrzeugnamen zurückzugeben, die mit
"M"
:Sobald Sie sich an die Kurzschrift Lambdas gewöhnt haben, können Sie auch Folgendes tun:
Sobald Sie dies tun, werden Sie leider
.map(Car::getName)
nur die Liste der Namen zurückgeben, nicht die Autos. Also weniger schön, aber vollständig beantwortet die Frage:quelle
Objects::nonNull
kann hier nicht verwendet werden, und in letzten Rat sollte es sein ,cars.stream() .filter(car -> Objects.nonNull(car.getName()))
glaube ichcars.stream() .filter(car -> Objects.nonNull(car.getName()) && car.getName().startsWith("M"))
wäre die Zusammenfassung Ihres Ratschlags in diesem Fragenkontext.startWith
auch einen Nullzeiger verursachen kann. Der Punkt, den ich ansprechen wollte, ist, dass Java eine Methode speziell zum Herausfiltern von Nullobjekten aus Ihren Streams bereitstellt.Objects.nonNull
ist gleichbedeutend mit!= null
, Ihre Option ist kürzerString
) statt Autos (Car
)?Sie müssen nur die Autos filtern, die einen
null
Namen haben:quelle
Die vorgeschlagenen Antworten sind großartig. Möchten einfach mal für eine Verbesserung vorzuschlagen , den Fall von null Liste mit zu handhaben
Optional.ofNullable
, neue Funktion in Java 8 :Die vollständige Antwort lautet also:
quelle
Objects::nonNull
löst nicht das Problem , da nicht-Null - Auto Namen haben == nullSie können dies in einem einzelnen Filterschritt tun:
Wenn Sie nicht
getName()
mehrmals anrufen möchten (z. B. ein teurer Anruf), können Sie Folgendes tun:Oder auf raffiniertere Weise:
quelle
Nutzen Sie die Kraft von
java.util.Optional#map()
:quelle
Sie können dies verwenden
quelle