当前位置: 首页 > 知识库问答 >
问题:

检查 Optional 的布尔值并在 true 时引发异常的最佳方法

陶俊晤
2023-03-14

我有一个可为空的变量id,通过它我可以通过getLocationById获取位置(同样为空)。
我想做的是if(id!=null

以下是我能想到的方法(除了先取出布尔值,然后在if语句之后抛出异常)。但是当id为空时,它会引发异常,这不是我想要的。

想知道有没有更好的方法?(我用的是Java17)


Optional.ofNullable(id).map(service::getLocationById)
      .filter(Predicate.not(Location::isDeprecated))
      .orElseThrow(()->new BadRequestException("Location is deprecated"))

编辑1:我想我可以做到以下几点,但如果有更好的主意,那就更好了:


Optional.ofNullable(id).map(service::getLocationById)
      .filter(Location::isDeprecated)
      .ifPresent(l->{ throw new BadRequestException("Location is deprecated");});

编辑2:问了所有这些,我同意@Holger在评论中使用旧的好方法提出的建议:

if(id != null) { 
  var loc = service.getLocationById(id); 
  if(loc != null && loc.isDeprecated()) 
    throw … 
}

因为

  1. 也相当清晰可读
  2. 我的代码在热路径中,可选方式引入了开销和额外的堆分配。

共有2个答案

周学义
2023-03-14

使用try catch块。当你处理可能的异常时,就像你的情况一样,让事情变得简单。

郭单鹗
2023-03-14

这取决于您的风格和同事的风格。当位置为 null 时,第二个行为不同,因此它们不相同。要使它的行为类似,你必须像这样调整它:

java prettyprint-override">Optional.ofNullable(id).map(service::getLocationById)
  .or(()-> Optional.of(createLocationWithDeprecatedFlag()))
  .filter(Location::isDeprecated)
  .ifPresent(l->{ throw new BadRequestException("Location is deprecated");});

不太好。所以在你的情况下,我建议采用你的第一种方法。它是可读的,从我的观点来看很好理解。

选项不能代替条件,应该在有意义的时候使用,而不是简单地不惜一切代价避免条件。您的情况也可以是一个或多或少简单的if,但可选性在这里并不太差。

 类似资料:
  • 问题内容: 我想要一种一致且简单的方法来在JNI代码中引发异常;处理链式异常的东西(隐式地来自env-> ExceptionOccurred方法,或者由参数显式表示,无论哪种方式都不错),并且每次执行此操作时都无需查找构造函数。尽管我可以根据需要从C ++进行翻译,但上述所有内容最好都用C语言编写。 SO上是否有人可以分享这样的东西? 问题答案: 我们只是为要抛出的每种异常类型编写实用程序方法。这

  • 问题内容: 我有一个的条目: 目前,我正在检查它是否包含真像这样: 这是检查布尔数组的 最快 方法吗?如果不是,执行此检查的最快方法是什么? 编辑: 通过在Android 4.03 Samsung S2设备上将其作为应用程序运行,我对您的答案中的方法进行了计时,如下所示: 在五次跑步中的时间排名最高,排名第一: 在5334和11584 ns之间: } return false; 在160542和1

  • 问题内容: 我正在编写一个Java程序,该程序读取一个单词文件。程序至关重要地依赖于此文件,因此,无论出于何种原因,在读取文件时都出现IOException,我确实希望程序结束。 结束程序的最佳方法是什么?我认为我被迫将文件读取包围在try / catch块中,因此我应该在catch中添加一个内部吗?例如,我应该做以下事情吗? 问题答案: 如果让异常一直传播到方法,程序将结束。无需调用,只需允许异

  • 问题内容: 在调用对象的函数之前,我需要检查对象是否为null,以避免引发。 最好的方法是什么?我考虑过这些方法。 哪一种是Java最佳编程实践? 问题答案: 方法4是最好的。 将使用短路评估,这意味着如果a的第一个条件为假,则评估结束。

  • 我有一个rest服务,它将抛出一个异常,我想知道什么将是最好的方式来处理这一点。 我想知道这是rest服务中处理异常的正确方式吗? 我在用泽西。

  • 我希望在数据库中找不到该项时出现异常