diff --git a/README.md b/README.md index 4f6c6c40..f782c6d6 100644 --- a/README.md +++ b/README.md @@ -70,10 +70,13 @@ 如方法`allTupleFastFailOf` / `allTupleOf` / `tupleMSupplyFastFailAsync` / `thenTupleMApplyFastFailAsync` - 支持直接运行多个`action`,而不是要先包装成`CompletableFuture` 如方法`tupleMSupplyFastFailAsync` / `mSupplyMostSuccessAsync` / `thenTupleMApplyFastFailAsync` / `thenMRunFastFailAsync` + - 支持处理指定异常类型的`catching`方法,而不是处理所有异常`Throwable`(`CompletableFuture#exceptionally`) - ⚙️ 更高效灵活的并发执行策略,如 - `AllFastFail`策略:当输入的多个`CF`有失败时快速失败返回,而不再于事无补地等待所有`CF`运行完成(`allOf`) - `AnySuccess`策略:返回首个成功的`CF`结果,而不是首个完成(但可能失败)的`CF`(`anyOf`) - - `MostSuccess`策略:指定时间内返回多个`CF`中成功的结果,忽略失败或还没有运行完成的`CF`(返回指定的缺省值) + - `AllSuccess`策略:返回多个`CF`的成功结果,对于失败的`CF`返回指定的缺省值 + - `MostSuccess`策略:指定时间内返回多个`CF`中成功的结果,对于失败或还没有运行完成的`CF`返回指定的缺省值 + - `All(Complete)`/`Any(Complete)`策略:这2个在`CompletableFuture`中有支持 - 🦺 更安全的使用方式,如 - 支持设置缺省的业务线程池并封装携带,`CffuFactory#builder(executor)`方法 - 支持超时的`join`的方法,`join(timeout, unit)`方法 @@ -87,7 +90,8 @@ - 非阻塞地获取成功结果,`getSuccessNow`方法 - 解包装`CF`异常成业务异常,`unwrapCfException`方法 - 💪 **已有功能的增强**,如 - - `anySuccessOf`/`anyOf`方法:返回具体类型`T`(类型安全),而不是返回`Object`(`CompletableFuture#anyOf`) + - `anyOf`方法:返回具体类型`T`(类型安全),而不是返回`Object`(`CompletableFuture#anyOf`) + - `allof`/`anyOf`方法:输入更宽泛的`CompletionStage`参数类型,而不是`CompletableFuture`类(`CompletableFuture#allOf/anyOf`) - ⏳ **`Backport`支持`Java 8`**,`Java 9+`高版本的所有`CF`新功能在`Java 8`低版本直接可用,如 - 超时控制:`orTimeout`/`completeOnTimeout`方法 - 延迟执行:`delayedExecutor`方法 diff --git a/cffu-core/src/main/java/io/foldright/cffu/CompletableFutureUtils.java b/cffu-core/src/main/java/io/foldright/cffu/CompletableFutureUtils.java index 3f377bff..981bfeeb 100644 --- a/cffu-core/src/main/java/io/foldright/cffu/CompletableFutureUtils.java +++ b/cffu-core/src/main/java/io/foldright/cffu/CompletableFutureUtils.java @@ -3873,6 +3873,7 @@ private static void completeCf(CompletableFuture cf, Object value, @Null C catchingCompose(C cfThis, Class exceptionType, Function> fallback) { requireNonNull(cfThis, "cfThis is null"); requireNonNull(fallback, "fallback is null"); + return (C) cfThis.handle((v, ex) -> (ex == null || !exceptionType.isAssignableFrom(ex.getClass())) ? cfThis : fallback.apply((X) ex) ).thenCompose(x -> x); @@ -3915,6 +3916,7 @@ public static > C c requireNonNull(cfThis, "cfThis is null"); requireNonNull(fallback, "fallback is null"); requireNonNull(executor, "executor is null"); + return (C) cfThis.handle((v, ex) -> (ex == null || !exceptionType.isAssignableFrom(ex.getClass())) ? cfThis : cfThis.handleAsync((v1, ex1) -> fallback.apply((X) ex1), executor).thenCompose(x -> x) ).thenCompose(x -> x);