Избегайте исключения NoSuchElementException с потоком
У меня есть следующий Stream
:
Stream<T> stream = stream();
T result = stream.filter(t -> {
double x = getX(t);
double y = getY(t);
return (x == tx && y == ty);
}).findFirst().get();
return result;
Однако не всегда есть результат, который дает мне следующую ошибку:
NoSuchElementException: нет значения
Итак, как я могу вернуть null
, если нет значения?
Ответы
Ответ 1
Вы можете использовать Optional.orElse
, это намного проще, чем проверка isPresent
:
T result = stream.filter(t -> {
double x = getX(t);
double y = getY(t);
return (x == tx && y == ty);
}).findFirst().orElse(null);
return result;
Ответ 2
Stream#findFirst()
возвращает Optional
который существует специально, так что вам не нужно оперировать null
значениями.
Контейнерный объект, который может содержать или не содержать ненулевое значение. Если значение присутствует, isPresent()
вернет true
а get()
вернет значение.
В противном случае, Optional#get()
создает NoSuchElementException
.
Если значение присутствует в этом Optional
, возвращает значение, в противном случае выбрасывает NoSuchElementException
.
Optional
никогда не будет выставлять свое значение, если оно является null
Если вам действительно нужно, просто проверьте isPresent()
и верните null
самостоятельно.
Stream<T> stream = stream();
Optional<T> result = stream.filter(t -> {
double x = getX(t);
double y = getY(t);
return (x == tx && y == ty);
}).findFirst();
if (result.isPresent())
return result.get();
return null;
Ответ 3
Альтернативный метод для замены Optional.get
(который, скорее всего, проваливает намерения пользователя с помощью NoSuchElementException) - это более подробный API, представленный в JDK10, называемый Optional.orElseThrow()
. В словах автора -
Optional.get()
- "привлекательная неприятность" и слишком заманчива для программистов, что приводит к частым ошибкам. Люди не ожидают, что получатель выбросит исключение. Должен быть добавлен API замены для Optional.get()
с эквивалентной семантикой.
Примечание: - Базовая реализация обоих этих API одинакова, но последний более четко считывает, что по умолчанию выдается исключение NoSuchElementException, если значение отсутствует, что указывает на существующий Optional.orElseThrow(Supplier<? extends X> exceptionSupplier)
Extends Optional.orElseThrow(Supplier<? extends X> exceptionSupplier)
реализация, используемая потребителями как явная альтернатива.