为了账号安全,请及时绑定邮箱和手机立即绑定

重写一个以更简洁的方式抛出异常的 if 语句

重写一个以更简洁的方式抛出异常的 if 语句

慕村225694 2022-06-15 15:54:57
假设我们有一个这样的 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);你怎么看?我可以以某种方式使它更清洁吗?我的意思是,例如使用 anOptional将其减少为 1 行.orElseThrow();
查看完整描述

3 回答

?
翻翻过去那场雪

TA贡献2065条经验 获得超13个赞

使用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"));

}


查看完整回答
反对 回复 2022-06-15
?
青春有我

TA贡献1784条经验 获得超8个赞

有人可能会争辩说,以相反的顺序阅读它会更自然,即首先处理验证及其结果,然后继续保存对象。


public A save(A a) {

    if (!isValid.test(a)) {

        throw new ANotValidException("A is not valid");

    }


    return aRepository.save(a);

}


查看完整回答
反对 回复 2022-06-15
?
拉莫斯之舞

TA贡献1820条经验 获得超10个赞

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


public A save(A a) {

    return Optional.ofNullable(a)

            .filter(isValid)

            .map(aRepository::save)

            .orElseThrow(() -> new ANotValidException("A is not valid"));

}

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


查看完整回答
反对 回复 2022-06-15
  • 3 回答
  • 0 关注
  • 136 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信