【问题标题】:The return value of "orElseThrow" must be used必须使用“orElseThrow”的返回值
【发布时间】:2018-09-07 00:21:34
【问题描述】:

当我使用声纳 lint 扫描代码时,以下代码将错误显示为“必须使用“orElseThrow”的返回值”

itemList.stream()
    .filter(item -> orderItemId.equals(item.getId()))
    .findAny()
    .orElseThrow(() -> new BadRequestException("12345","Item Not Found"));

这只是为了验证目的,不需要从这个语句中返回任何东西。需要验证该项目是否存在。

仅供参考:Eclipse 将快速修复显示为 squid:S2201

有人知道如何解决这个错误吗?

【问题讨论】:

  • 感谢@Aominè 的解决方案。 if(itemList.stream().noneMatch(i->orderItemId.equals(i.getId()))){ throw new BadRequestException("12345","Item Not Found"); }

标签: java java-8 sonarqube


【解决方案1】:

我假设这是一个警告(不使用 orElseThrow() 返回的值不应该是错误)。

如果您希望消除该警告,请改用isPresent()

if (!itemList.stream().filter(i->orderItemId.equals(i.getId())).findAny().isPresent()) {
    throw new BadRequestException("12345","Item Not Found");
}

或者只是避免使用Optionals,而使用anyMatch()

if (!itemList.stream().anyMatch(i->orderItemId.equals(i.getId()))) {
    throw new BadRequestException("12345","Item Not Found");
}

【讨论】:

  • 使用 empty() 似乎不是正确的方法。但是第二个选项 anyMatch() 是解决这个问题的完美解决方案。谢谢。
  • 对于第一个解决方案,我相信您正在寻找!itemList.stream().filter(i->orderItemId.equals(i.getId())).findAny().isPresent(),但更好的解决方案是使用itemList.stream().noneMatch(i->orderItemId.equals(i.getId()))
  • @Aominè 是的,出于某种原因,我确信有一个 empty() 方法可以指示现有 Optional 是否为空。
  • ...并首先使用noneMatch 消除逻辑非
  • 我的观点是,这不是一个解决方案,仅因为误报警告而将代码更改为简单的 orElseThrow 为其他内容。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-24
  • 2019-01-30
  • 2017-04-22
相关资源
最近更新 更多