Переписать оператор if, который выбрасывает исключение более понятным способом - PullRequest
0 голосов
/ 12 февраля 2019

Предположим, у нас есть выражение if, подобное этому:

public A save(A a) {
    if (isValid.test(a)) {
        return aRepository.save(a);
    }
    throw new ANotValidException("A is not valid");
}

isValid - это предикат, и оно может выглядеть следующим образом:

private Predicate<A> isValid = (a) -> (a != null);

Как вы думаете?Могу ли я сделать это чище как-нибудь?Я имею в виду, например, использование Optional, чтобы уменьшить его в 1 строку с .orElseThrow();

Ответы [ 3 ]

0 голосов
/ 12 февраля 2019

Можно утверждать, что было бы более естественно прочитать его в обратном порядке, то есть сначала обработать проверку и результат, а затем перейти к сохранению объекта.

public A save(A a) {
    if (!isValid.test(a)) {
        throw new ANotValidException("A is not valid");
    }

    return aRepository.save(a);
}
0 голосов
/ 12 февраля 2019

Более точная версия с использованием Optional и throw с пользовательским Exception должна быть:

public A save(A a) throws ANotValidException { // throws the custom exception
    return Optional.ofNullable(a) // since your predicate is to check for not null 
                   .map(aRepository::save)
                   .orElseThrow(() -> new ANotValidException(a + "A is not valid"));
}
0 голосов
/ 12 февраля 2019

Optional может сделать код более читабельным, особенно при использовании объекта предиката:

public A save(A a) {
    return Optional.ofNullable(a)
            .filter(isValid)
            .map(aRepository::save)
            .orElseThrow(() -> new ANotValidException("A is not valid"));
}

Вы также можете полностью избавиться от предиката, поскольку он достаточно прост для использования Objects::nonNull(если тест вашего реального предиката не является более сложным).И в этом случае сохранение ваших текущих проверок состояния, вероятно, имело бы больше смысла (на мой взгляд).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...