gpt4 book ai didi

java - 在 Stream API 中使用 checked 装饰器函数是好的解决方案吗?

转载 作者:搜寻专家 更新时间:2023-10-30 23:02:17 24 4
gpt4 key购买 nike

我使用的是 Java 8 Stream API,据我们所知,它不支持 java.util.function 内任何功能接口(interface)内的已检查异常。

我通常必须在流操作中使用带有检查异常的方法,并且我编写了 CheckedFunction 装饰器以在这些操作中使用:

import java.util.function.BiFunction;
import java.util.function.Function;

public interface CheckedFunction<T, R, E extends Throwable> {

R apply(T t) throws E;

static <T, R, CE extends Throwable, UCE extends RuntimeException> Function<T, R> checked(
CheckedFunction<T, R, CE> checked, Function<CE, UCE> exceptionHandler) {
return (t) -> {
try {
return checked.apply(t);
}
catch (RuntimeException | Error e) {
throw e;
}
catch (Throwable e) {
// can't catch - compiler error
if (e instanceof InterruptedException) {
Thread.currentThread().interrupt();
}
throw exceptionHandler.apply((CE) e);
}
};
}
}

所以我可以在这种情况下使用它:

entities.stream()
.map(checked((entity) -> someResultChecked(entity), // throws IOException
(entity, e) -> { // e is of type IOException
log.error("exception during checked method of " + entity, e);
return new UncheckedIOException(e);
}))
.map(checked((entity) -> saveToDb(entity), // throws SQLException
(entity, e) -> { // e is of type SQLException
log.error("exception during saving " + entity, e);
return new UncheckedSQLException(e);
}))
.map(checked((entity) -> manyExceptionMethod(entity), // throws IOException, SQLException
(entity, e) -> { // e is of type Throwable
return new RuntimeException(e);
}))

它将任何已检查的异常包装为未检查的,但我知道如果方法抛出多个异常,它将清除为 Throwable,我将在简单的情况下使用它。

这是个好主意,还是我会遇到隐藏的障碍?

更新:重新抛出 RuntimeExceptions。

我还在 jOOL 中找到了更清晰的解决方案,处理 InterruptedException 如果将被忽略,可能会导致不一致的行为: https://github.com/jOOQ/jOOL/blob/master/src/main/java/org/jooq/lambda/Unchecked.java

最佳答案

如果除了 IOException 以外的任何东西被抛出,您将得到一个 ClassCastException,因为您正在捕获所有 Throwable 并将它们传递给UncheckedIOException 构造函数,它只接受一个 IOException 作为参数。由于在函数类型中捕获 IOException 是一种常见的需求,与其试图概括,最好保持简单,只为检查的异常制作一个。我想您很少需要复制代码来对其他已检查的异常执行相同的操作。

@FunctionalInterface
public interface CheckedIOFunction<T,R> {

R apply(T t) throws IOException;

static <T, R> Function<T, R> toUnchecked(CheckedIOFunction<T, R> function) {
return t -> {
try {
return function.apply(t);
} catch (IOException ioe) {
throw new UncheckedIOException(ioe);
}
};
}
}

关于java - 在 Stream API 中使用 checked 装饰器函数是好的解决方案吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36625381/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com