【问题标题】:Is it a bad practice to throw exceptions in java 8 optional filters [closed]在 java 8 可选过滤器中抛出异常是一种不好的做法吗[关闭]
【发布时间】:2019-12-30 14:44:16
【问题描述】:

我想利用 java 8 optional 来验证接收到的对象的值(作为响应)。我很想知道,如果按照以下方式进行操作是不好的做法。

Optional.ofNullable(response)
.map(Response::getStatus)
.filter(status -> {
    if (status == Status.REJECTED)
        throw new RequestRejectedException("some exception");
    else if (status == Status.LOCKED)
        throw new ResourceLockedException("some other exception");
    return true;
})
.orElse(Status.UNAVAILABLE);

想知道,如果这样写类似上面的东西是否可以接受,或者是否有更好的方法,请提出建议。

【问题讨论】:

  • 对控制流使用异常是一个热门话题,有人说这是一种不好的做法,另一些人说这很好,因为它更简单......我的建议,如果你在代码中使用控制流之类的异常它,如果没有尝试使用 return false。
  • @Adrian 我相信我理解 Optional 的主要目标,但我的问题更多是关于使用 filter() 验证 Optional 包裹的值以及如果抛出异常是否违反任何规定从那里。您提供的链接实际上并没有回答我的问题。
  • status == 'rejected' 不是有效的 Java,即使 statusString,但看起来 Statusenum...
  • 你为什么最后打电话给.orElse(Status.UNAVAILABLE);?你真的在使用返回的状态吗?

标签: java exception java-8 filtering optional


【解决方案1】:

不,不行。

return true;

你不过滤任何东西,是吗?知道状态后处理异常会更好。

final String status = Optional.ofNullable(response)
                              .map(Response::getStatus)
                              .orElse(Status.UNAVAILABLE);

if ("rejected".equals(status)) {
    throw new RequestRejectedException("some exception");
}

从您的评论来看,您似乎明白Optional 的用途。无需警告您这是不恰当的用法。

【讨论】:

  • 感谢您的回复。是的,我认为这不合适,但想确保确实如此。现在扩展这个问题,我需要验证响应对象中的其他几个字段(如果返回不可接受的值,它们也需要以不同的方式抛出异常,然后它们将由异常处理程序适当处理)。我最初的想法是为每个字段验证链接过滤器(如 filter(validateStatus()).filter(validateType()) 等)。但似乎我最好获取每个字段并分别验证它们。对吗?
  • @user3495691 filter(validateStatus()) 看起来不太对劲。将其与filter(canBeValidated())filter(isValid()) 进行比较。 “获取每个字段并验证它们”似乎更简单、更清晰、更合理。
  • 如果他用peek而不是filter呢?
  • @VinceEmigh 我想过。首先,Optional 没有 peek。二、peek主要用于调试流程。
猜你喜欢
  • 1970-01-01
  • 2020-11-10
  • 1970-01-01
  • 1970-01-01
  • 2012-10-12
  • 1970-01-01
  • 1970-01-01
  • 2012-08-22
  • 1970-01-01
相关资源
最近更新 更多