Jestem wielkim fanem operatora strumienia singleOrEmpty
. Nie ma go w std lib, ale uważam, że jest bardzo użyteczny. Jeśli strumień ma tylko jedną wartość, zwraca tę wartość w postaci Optional
. Jeśli nie ma wartości lub więcej niż jedną wartość, zwraca Optional.empty()
.Java 8 Spliterator (lub podobny), który zwraca wartość iff jest tylko jedna wartość
Optional<Int> value = someList.stream().{singleOrEmpty}
[] -> Optional.empty()
[1] -> Optional.of(1)
[1, 1] -> Optional.empty()
etc.
I asked a question about it earlier i @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());
}
Jedynym problemem jest to, trzeba umieścić go na początku rozmowy
singleOrEmpty(someList.stream().filter(...).map(...))
zamiast kolejno na końcu
someList.stream().filter().map().singleOrEmpty()
co sprawia, że trudniej jest go odczytać niż inne mechanizmy strumieniowe.
Więc jak nowo narodzony w tym strumieniu przetwarzania rzeczy, czy ktoś ma żadnych sztuczek, jak go o oddanie Zwarcie singleOrEmpty
mechanizmu na końcu sekwencji przemian strumienia ?
myślę, że to nie jest możliwe w Java 8, podobna historia tutaj (http://stackoverflow.com/questions/22308823/extending-listt-in-java-8) –