Ich habe einen Strom von Enum-Werten, die ich reduzieren möchte. Wenn der Stream leer ist oder andere Werte enthält, möchte ich null
. Wenn es nur einen einzelnen Wert (mehrere Instanzen) enthält, möchte ich diesen Wert.Warum wirft Stream.reduce (BinaryOperator) NullPointer, wenn das Ergebnis null ist?
[] null
[A, B, A] null
[A] A
[A, A, A] A
Ich versuchte es mit einem reduzieren zu tun:
return <lots of filtering, mapping, and other stream stuff>
.reduce((enum1, enum2) -> enum1 == enum2 ? enum1 : null)
.orElse(null);
Leider ist dies nicht funktioniert, weil diese Methode eine NullPointerException
wirft reduzieren, wenn das Ergebnis null
ist. Weiß jemand, warum das passiert? Warum ist null
kein gültiges Ergebnis?
Vorerst Ich löste dies wie folgt aus:
MyEnum[] array = <lots of filtering, mapping, and other stream stuff>
.distinct()
.toArray(MyEnum[]::new);
return array.length == 1 ? array[0] : null;
Während dies funktioniert, ich bin nicht zufrieden mit diesem „Umweg“. Mir gefiel das Reduzieren, weil es schien, als wäre es das Richtige und legte alles in einen Stream.
Kann jemand an eine Alternative zum Reduzieren denken (das ist im Idealfall nicht zu viel Code)?
Diese Antwort könnte Ihnen einen Einblick geben, warum http://StackOverflow.com/a/17115490/1544715 – Magnus