Tôi đang sử dụng API Java 8 Stream và vì chúng tôi biết nó không hỗ trợ các ngoại lệ đã kiểm tra bên trong bất kỳ giao diện chức năng nào bên trong java.util.function.Có phải là giải pháp tốt để sử dụng chức năng trang trí được kiểm tra trong API luồng không?
tôi thường phải sử dụng phương pháp với ngoại lệ kiểm tra bên trong hoạt động suối và tôi đã viết CheckedFunction trang trí để sử dụng trong những hoạt động:
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);
}
};
}
}
vì vậy tôi có thể sử dụng nó trong những trường hợp như:
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);
}))
Nó sẽ bọc bất kỳ ngoại lệ kiểm tra để bỏ chọn, nhưng tôi biết nếu phương pháp được ném nhiều hơn một ngoại lệ nó sẽ xóa để Throwable, tôi sẽ sử dụng nó trong trường hợp đơn giản.
Ý tưởng hay là tôi có thể gặp phải những trở ngại tiềm ẩn?
CẬP NHẬT: Làm lại RuntimeExceptions.
Ngoài ra tôi tìm thấy giải pháp rõ ràng hơn trong jOOL với xử lý InterruptedException mà có thể gây ra hành vi không phù hợp sẽ bị bỏ qua nếu: https://github.com/jOOQ/jOOL/blob/master/src/main/java/org/jooq/lambda/Unchecked.java
Bạn nên có một cái nhìn tại JavaRx mà cung cấp một API tốt đẹp cho streaming với xử lý lỗi – flakes
Cảm ơn, tôi đã cố gắng để nhìn vào nhiều lần, nhưng luôn luôn cho up.Maybe đó là một tín hiệu mà tôi cần để sắp xếp nó ra . – Monk3D