From 158290c38808044cc65c41a176db9ae9e55d9715 Mon Sep 17 00:00:00 2001 From: VampireAchao Date: Sat, 22 Jan 2022 12:08:36 +0800 Subject: [PATCH] =?UTF-8?q?AsyncUtil=E4=B8=8B=E5=A2=9E=E5=8A=A0getOpt?= =?UTF-8?q?=E6=96=B9=E6=B3=95=EF=BC=8C=E7=94=A8=E4=BA=8E=E6=89=A7=E8=A1=8C?= =?UTF-8?q?=E5=A4=B1=E8=B4=A5=E6=97=B6=E6=8F=90=E4=BE=9B=E9=BB=98=E8=AE=A4?= =?UTF-8?q?=E5=80=BC=EF=BC=8C=E4=B9=9F=E8=83=BD=E8=87=AA=E5=AE=9A=E8=8E=B7?= =?UTF-8?q?=E5=8F=96=E5=BC=82=E5=B8=B8;=E6=8B=93=E5=B1=95=E4=BA=86Opt.ofEm?= =?UTF-8?q?ptyAble=E6=96=B9=E6=B3=95=EF=BC=8C=E4=BD=BF=E5=85=B6=E5=8F=AF?= =?UTF-8?q?=E4=BB=A5=E5=88=A4=E6=96=ADCollection=E4=B8=8B=E7=9A=84?= =?UTF-8?q?=E5=85=B6=E4=BB=96=E9=9B=86=E5=90=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/cn/hutool/core/lang/Opt.java | 11 ++++++----- .../main/java/cn/hutool/core/thread/AsyncUtil.java | 13 +++++++++++++ .../java/cn/hutool/core/thread/AsyncUtilTest.java | 9 +++++++++ 3 files changed, 28 insertions(+), 5 deletions(-) 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()); } }