Ich bin ein großer Fan des Stream-Operators singleOrEmpty
. Es ist nicht in der Standardbibliothek, aber ich finde es sehr nützlich. Wenn ein Stream nur einen einzelnen Wert hat, gibt er diesen Wert in Optional
zurück. Wenn es keine Werte oder mehr als einen Wert hat, gibt es Optional.empty()
zurück.Java 8 Spliterator (oder ähnlich), der einen Wert zurückgibt, wenn es nur einen einzigen Wert gibt
Optional<Int> value = someList.stream().{singleOrEmpty}
[] -> Optional.empty()
[1] -> Optional.of(1)
[1, 1] -> Optional.empty()
etc.
I asked a question about it earlier und @ThomasJungblut came up with this great implementation:
public static <T> Optional<T> singleOrEmpty(Stream<T> stream) {
return stream.limit(2)
.map(Optional::ofNullable)
.reduce(Optional.empty(),
(a, b) -> a.isPresent()^b.isPresent() ? b : Optional.empty());
}
Das einzige Problem ist, müssen Sie es zu Beginn des Gesprächs am Ende
singleOrEmpty(someList.stream().filter(...).map(...))
anstatt nacheinander setzen
someList.stream().filter().map().singleOrEmpty()
, die es schwieriger zu lesen als andere Stream-Mechanismen macht.
So als Neuling zu dieser Verarbeitung Sachen Strom, hat jemand irgendwelche Tricks, wie ein Kurzschließen singleOrEmpty
Mechanismus am Ende eine Folge von Strom Transformationen setzen geht über?
ich denke, das 8, ähnliche Geschichte hier in Java nicht möglich ist (http://stackoverflow.com/questions/22308823/extending-listt-in-java-8) –