重写if语句,以更简洁的方式引发异常

时间:2019-02-12 14:50:02

标签: java optional predicate code-cleanup

假设我们有一个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.orElseThrow();

将其缩小为1行

3 个答案:

答案 0 :(得分:1)

Optional可以使代码更具可读性,尤其是在使用谓词对象时:

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

您也可以完全摆脱谓词,因为使用Objects::nonNull非常简单(除非您实际谓词的测试更复杂)。在那种情况下,保持您当前的状况检查可能更有意义(我认为)。

答案 1 :(得分:1)

有人会说,以相反的顺序阅读它会更自然,那就是先处理验证及其结果,然后继续保存对象。

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

    return aRepository.save(a);
}

答案 2 :(得分:1)

使用Optionalthrow定义自定义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"));
}