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中文网其他相关文章!