Dlaczego w praktyce jest to przydatne?
Na przykład załóżmy, że masz ten strumień liczb całkowitych i robisz filtrowanie:
int x = IntStream.of(1, -3, 5)
.filter(x -> x % 2 == 0)
.findFirst(); //hypothetical assuming that there's no Optional in the API
nie wiesz z góry, że operacja filtr usunie wszystkie wartości w Strumieniu .
Załóżmy, że w interfejsie API nie będzie opcji Opcjonalne. W takim przypadku, co powinieneś zwrócić: findFirst
?
Jedynym możliwym sposobem byłoby wyrzucenie wyjątku, takiego jak NoSuchElementException
, co jest IMO dość irytujące, ponieważ nie uważam, że powinno to zatrzymać wykonywanie programu (lub musiałbyś złapać wyjątek, nie bardzo wygodne) i kryteria filtrowania mogą być bardziej złożone.
Przy użyciu numeru Optional
, od dzwoniącego zależy sprawdzenie, czy Optional
jest pusty, czy nie (np. Jeśli obliczenie zakończyło się wartością lub nie).
z typem odniesienia, można również powrócić null
(ale null
mogłaby być możliwa wartość w przypadku filtrować tylko null
wartości, więc wracamy do sprawy wyjątków).
Jeśli chodzi o zastosowania inne niż strumieniowe, to oprócz zapobiegania NPE, myślę, że pomaga to również zaprojektować bardziej przejrzyste API, które mówi, że wartość może być obecna. Na przykład rozważyć tę klasę:
class Car {
RadioCar radioCar; //may be null or not
public Optional<RadioCar> getRadioCar() {
return Optional.ofNullable(radioCar);
}
}
Tu są wyraźnie mówiący do rozmówcy, że radio w samochodzie jest opcjonalny, może to być albo nie istnieje.
Opcjonalne nie może zawierać wartości null ... – ZhongYu