Перепишите выражение if с помощью Optional map и filter - PullRequest
0 голосов
/ 31 октября 2018

У меня есть предикат, который принимает Optional<LocalDateTime>, и я хочу проверить, присутствует ли он, а LocalDateTime - до текущей даты.

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

@Override
public boolean test(Optional<ResetPassword> resetPassword) {
    if (resetPassword.isPresent()) {
        if (!resetPassword.get().getValidUntil().isBefore(LocalDateTime.now())) {
            throw new CustomException("Incorrect date");
        }
        return true;
    }
    return false;
}

Как я могу переписать это, используя функции Optional.map и Optional.filter?

Ответы [ 2 ]

0 голосов
/ 31 октября 2018

Я надеюсь, что это поможет вам, кроме того, обратите внимание на исключение, которое вы бросаете, если это RuntimeException ваше приложение будет аварийно завершать работу в случае ложного условия.

 public boolean test(Optional<ResetPassword> resetPassword) {
        return resetPassword.isPresent() && resetPassword
                .map(ResetPassword::getValidUntil)
                .filter(localDateTime -> localDateTime.isBefore(LocalDateTime.now()))
                .orElseThrow(() -> new CustomException("Incorrect date")) != null;
    }
0 голосов
/ 31 октября 2018

Вы никогда не должны использовать Optional в качестве параметра для чего-либо. Вместо этого вы должны позволить вашей функции принимать ResetPassword и вызывать ее, только если присутствует значение Optional. Как это:

public void test(ResetPassword resetPassword) {
    if (!resetPassword.getValidUntil().isBefore(LocalDateTime.now())) {
        throw new CustomException("Incorrect date");
    }
}

А потом назовите это так:

resetPasswordOptional
    .ifPresent(rp -> test(rp));
...