Ответ 1
На практике, почему это полезно?
Например, скажем, у вас есть этот поток целых чисел, и вы делаете фильтрацию:
int x = IntStream.of(1, -3, 5)
.filter(x -> x % 2 == 0)
.findFirst(); //hypothetical assuming that there no Optional in the API
Вы не знаете заранее, что операция фильтра удалит все значения в потоке.
Предположим, что в API не будет необязательного. В этом случае, что должно findFirst
вернуться?
Единственным возможным способом могло бы стать исключение, такое как NoSuchElementException
, что является IMO довольно раздражающим, поскольку я не думаю, что это должно остановить выполнение вашей программы (или вам придется поймать исключение, не очень удобно), и критерии фильтрации могут быть более сложными, чем это.
С помощью Optional
, до вызывающего, чтобы проверить, является ли Optional
пустым или нет (например, если ваше вычисление привело к значению или нет).
С ссылочным типом вы также можете вернуть null
(но null
может быть возможным значением в случае, если вы фильтруете только значения null
, поэтому вернемся к случаю исключения).
Что касается не-потоковых обычаев, в дополнение к предотвращению NPE, я думаю, что это также помогает разрабатывать более явный API, говорящий, что значение может присутствовать или нет. Например, рассмотрим этот класс:
class Car {
RadioCar radioCar; //may be null or not
public Optional<RadioCar> getRadioCar() {
return Optional.ofNullable(radioCar);
}
}
Здесь вы четко говорите вызывающему, что радио в машине не является обязательным, возможно, оно или нет.