首页  >  文章  >  Java  >  在 Java 8 中将 Lambda 表达式与流结合使用时如何处理检查异常?

在 Java 8 中将 Lambda 表达式与流结合使用时如何处理检查异常?

DDD
DDD原创
2024-10-27 05:06:301002浏览

How to Handle Checked Exceptions When Using Lambda Expressions with Streams in Java 8?

Java 8:Lambda 流,通过异常处理方法进行过滤

在 Java 8 中,流中的 lambda 表达式可以有效地过滤元素。但是,在处理抛出 IOException 等已检查异常的方法时,可能会出现复杂情况。

以下代码片段演示了此问题:

<code class="java">class Bank {
    public Set<String> getActiveAccountNumbers() throws IOException {
        Stream<Account> s = accounts.values().stream();
        s = s.filter(a -> a.isActive());
        Stream<String> ss = s.map(a -> a.getNumber());
        return ss.collect(Collectors.toSet());
    }
}
interface Account {
    boolean isActive() throws IOException;
    String getNumber() throws IOException;
}</code>

此代码无法编译,因为它无法处理lambda 表达式中的 isActive 和 getNumber 方法抛出 IOException。

要解决此问题,我们需要在异常转义 lambda 之前捕获该异常:

<code class="java">s = s.filter(a -> {
    try {
        return a.isActive();
    } catch (IOException e) {
        throw new UncheckedIOException(e);
    }
});</code>

当 lambda 被评估时在未声明受检异常的不同上下文中,我们将受检异常包装在未受检异常中。

或者,您可以使用一种方法来消除编译器的异常检查:

<code class="java">return s.filter(a -> uncheckCall(a::isActive))
        .map(Account::getNumber)
        .collect(toSet());</code>

其中 uncheckCall 定义为:

<code class="java">public static <T> T uncheckCall(Callable<T> callable) {
    try {
        return callable.call();
    } catch (Exception e) {
        sneakyThrow(e);
        return null; // Unreachable but needed to satisfy compiler
    }
}</code>

此方法有效地将已检查的异常转换为未检查的异常。但是,应谨慎使用,因为如果处理不当,可能会导致意外行为。

以上是在 Java 8 中将 Lambda 表达式与流结合使用时如何处理检查异常?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn