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