如何在Java流中处理异常

3
我该如何使用流将此for循环转换?
for (final Foo foo : fooList) {
    if (!FooConstant.FOO_TYPE.equals(foo.getType())) {
        throw new BadRequestException(
          LOGGER,
          FooErrorEnum.NOT_FOO_TYPE.name(),
          String.format("Element %s is not Foo type", foo.getId())
        );
    }
}

我尝试这样做,但在 orElseThrow() 中没有可用的 foo.getId()。 注意:BadRequestException 是已检查异常。

fooList.stream().filter(foo -> !FooConstant.FOO_TYPE.equals(foo.getType())
    .findFirst()
    .orElseThrow(() -> new BadRequestException(LOGGER, FooErrorEnum.NOT_FOO_TYPE.name(), String.format("Element %s is not Foo type", foo.getId()));
1个回答

3
你需要使用 Optional#ifPresent 方法。
fooList.stream().filter(foo -> !FooConstant.FOO_TYPE.equals(foo.getType())
                .findFirst()
                .ifPresent(foo -> {
                     throw new BadRequestException(LOGGER, FooErrorEnum.NOT_FOO_TYPE.name(), String.format("Element %s is not Foo type", foo.getId())
                });

但有点奇怪的是,我们通常会反其道而行,使用 Optional 过滤无效选项,并找到第一个有效选项。在你的示例中,只有当一切正常时才会执行 orElseThrow,因此不应该抛出任何异常。

请注意,BadRequestException 必须是一个 RuntimeException,否则编译会失败


如果它是一个已检查的异常,我们该怎么办?我们如何使用orElseThrow? - DarkCrow
@Deepak,你不能从ifPresentorElseThrow中抛出已检查异常。请阅读以下内容:https://dev59.com/KV4c5IYBdhLWcg3wscDI - Andrew Tobilko
那么在这种情况下,我只能使用for循环吗? - DarkCrow
1
@Deepak 是的(如果您想从 ifPresent 抛出已检查的异常)。您可以在 Lambda 中抛出未检查的异常,通过围绕“fooList.stream()”的 try-catch 块拦截它,并重新抛出已检查的异常,但这太麻烦了。简单的循环总是更好的选择。 - Andrew Tobilko

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接