diff --git a/hutool-core/src/main/java/cn/hutool/core/lang/Opt.java b/hutool-core/src/main/java/cn/hutool/core/lang/Opt.java index dad1b5cd0..363d3a625 100644 --- a/hutool-core/src/main/java/cn/hutool/core/lang/Opt.java +++ b/hutool-core/src/main/java/cn/hutool/core/lang/Opt.java @@ -24,12 +24,12 @@ */ package cn.hutool.core.lang; -import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.collection.CollUtil; import cn.hutool.core.lang.func.Func0; import cn.hutool.core.lang.func.VoidFunc0; import cn.hutool.core.util.StrUtil; -import java.util.List; +import java.util.Collection; import java.util.NoSuchElementException; import java.util.Objects; import java.util.Optional; @@ -101,18 +101,19 @@ public class Opt { } /** - * 返回一个包裹里{@code List}集合可能为空的{@code Opt},额外判断了集合内元素为空的情况 + * 返回一个包裹里{@code Collection}集合可能为空的{@code Opt},额外判断了集合内元素为空的情况 * * @param value 传入需要包裹的元素 * @param 包裹里元素的类型 * @return 一个包裹里元素可能为空的 {@code Opt} * @since 5.7.17 */ - public static Opt> ofEmptyAble(List value) { - return CollectionUtil.isEmpty(value) ? empty() : new Opt<>(value); + public static > Opt ofEmptyAble(R value) { + return CollUtil.isEmpty(value) ? empty() : new Opt<>(value); } /** + * 传入一段操作,包裹异常 * * @param supplier 操作 * @param 类型 diff --git a/hutool-core/src/main/java/cn/hutool/core/thread/AsyncUtil.java b/hutool-core/src/main/java/cn/hutool/core/thread/AsyncUtil.java index ab9947744..4dc8efcee 100644 --- a/hutool-core/src/main/java/cn/hutool/core/thread/AsyncUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/thread/AsyncUtil.java @@ -1,5 +1,7 @@ package cn.hutool.core.thread; +import cn.hutool.core.lang.Opt; + import java.lang.reflect.UndeclaredThrowableException; import java.util.concurrent.CompletableFuture; import java.util.concurrent.ExecutionException; @@ -60,4 +62,15 @@ public class AsyncUtil { } } + /** + * 获取异步任务结果,包裹了异常,并返回 {@link Opt} + * + * @param 任务返回值类型 + * @param task 异步任务 + * @return 任务返回值 + */ + public static Opt getOpt(CompletableFuture task) { + return Opt.ofTry(task::get); + } + } diff --git a/hutool-core/src/test/java/cn/hutool/core/thread/AsyncUtilTest.java b/hutool-core/src/test/java/cn/hutool/core/thread/AsyncUtilTest.java index 89d6640d2..e7bdc110d 100644 --- a/hutool-core/src/test/java/cn/hutool/core/thread/AsyncUtilTest.java +++ b/hutool-core/src/test/java/cn/hutool/core/thread/AsyncUtilTest.java @@ -1,5 +1,7 @@ package cn.hutool.core.thread; +import cn.hutool.core.exceptions.ExceptionUtil; +import cn.hutool.core.lang.Opt; import org.junit.Assert; import org.junit.Ignore; import org.junit.Test; @@ -34,5 +36,12 @@ public class AsyncUtilTest { AsyncUtil.waitAll(hutool, sweater, warm); // 获取结果 Assert.assertEquals("hutool卫衣真暖和", AsyncUtil.get(hutool) + AsyncUtil.get(sweater) + AsyncUtil.get(warm)); + + Opt opt = AsyncUtil.getOpt(CompletableFuture.supplyAsync(() -> { + ExceptionUtil.wrapRuntimeAndThrow("Ops!"); + return "whatever"; + })); + Assert.assertTrue(opt.isFail()); + Assert.assertEquals("java.lang.RuntimeException: Ops!", opt.getException().getMessage()); } }