Подтвердить что ты не робот

Избегайте исключения 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, если нет значения?

4b9b3361

Ответ 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) реализация, используемая потребителями как явная альтернатива.