【问题标题】:How to throw an exception from a stream after a filtering operation过滤操作后如何从流中抛出异常
【发布时间】:2019-12-17 12:51:16
【问题描述】:

大家好!

我有以下代码:

    statusLiquidationsFromPegaDictionary.
                stream()
                .filter(statusLiquidation -> statusCode.equals(statusLiquidation.getId()))
                .anyMatch(statusLiquidation -> statusLiquidation.getDecl().equals("N"));

现在我在过滤后得到一个空列表。我想在这种情况下抛出一个异常。我可以在同一个流中执行此操作吗?

【问题讨论】:

  • 您不会得到“过滤后的空列表”。这不是流的工作方式。你只是没有得到匹配两个谓词的元素。
  • 是的,在流中过滤后可能是0个元素,anyMatch不需要调用,我要抛出异常
  • 不,你仍然对how streams work 有误解。没有“过滤后”。每个元素都根据过滤谓词进行检查,如果匹配,则根据 anyMatch 谓词进行检查。如果它也匹配,则操作结束而无需根据过滤谓词检查所有元素。就像你指定了statusLiquidationsFromPegaDictionary.stream().anyMatch(statusLiquidation -> statusCode.equals(statusLiquidation.getId())&&statusLiquidation.getDecl().equals("N"));一样,没有区别。

标签: java exception java-stream


【解决方案1】:

如果你真的想在没有元素匹配第一个过滤器的情况下抛出异常(正如你在 cmets 中提到的那样),你必须分两步完成:

final List<StatusLiquidation> withCorrectStatus = statusLiquidationsFromPegaDictionary
        .stream()
        .filter(statusLiquidation -> statusCode.equals(statusLiquidation.getId()))
        .collect(toList());

if (withCorrectStatus.isEmpty()) {
    throw new Exception("Nothing found");
}

return withCorrectStatus.stream()
        .anyMatch(statusLiquidation -> statusLiquidation.getDecl().equals("N"));

【讨论】:

  • 第一次过滤后我需要检查计数元素,如果 0 则抛出 SomeException
  • 我猜你必须分两步完成
  • 是的,谢谢。它正确。我认为可能在一个流中
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-12
相关资源
最近更新 更多