From 158290c38808044cc65c41a176db9ae9e55d9715 Mon Sep 17 00:00:00 2001 From: VampireAchao Date: Sat, 22 Jan 2022 12:08:36 +0800 Subject: [PATCH 1/3] =?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()); } } From c9ad39ab3a4c95b80bd8f0e71f518e671558a929 Mon Sep 17 00:00:00 2001 From: achao Date: Mon, 7 Feb 2022 21:20:16 +0800 Subject: [PATCH 2/3] =?UTF-8?q?Revert=20"AsyncUtil=E4=B8=8B=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0getOpt=E6=96=B9=E6=B3=95=EF=BC=8C=E7=94=A8=E4=BA=8E?= =?UTF-8?q?=E6=89=A7=E8=A1=8C=E5=A4=B1=E8=B4=A5=E6=97=B6=E6=8F=90=E4=BE=9B?= =?UTF-8?q?=E9=BB=98=E8=AE=A4=E5=80=BC=EF=BC=8C=E4=B9=9F=E8=83=BD=E8=87=AA?= =?UTF-8?q?=E5=AE=9A=E8=8E=B7=E5=8F=96=E5=BC=82=E5=B8=B8;=E6=8B=93?= =?UTF-8?q?=E5=B1=95=E4=BA=86Opt.ofEmptyAble=E6=96=B9=E6=B3=95=EF=BC=8C?= =?UTF-8?q?=E4=BD=BF=E5=85=B6=E5=8F=AF=E4=BB=A5=E5=88=A4=E6=96=ADCollectio?= =?UTF-8?q?n=E4=B8=8B=E7=9A=84=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 This reverts commit 158290c38808044cc65c41a176db9ae9e55d9715. --- .../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, 5 insertions(+), 28 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 363d3a625..dad1b5cd0 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.CollUtil; +import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.lang.func.Func0; import cn.hutool.core.lang.func.VoidFunc0; import cn.hutool.core.util.StrUtil; -import java.util.Collection; +import java.util.List; import java.util.NoSuchElementException; import java.util.Objects; import java.util.Optional; @@ -101,19 +101,18 @@ public class Opt { } /** - * 返回一个包裹里{@code Collection}集合可能为空的{@code Opt},额外判断了集合内元素为空的情况 + * 返回一个包裹里{@code List}集合可能为空的{@code Opt},额外判断了集合内元素为空的情况 * * @param value 传入需要包裹的元素 * @param 包裹里元素的类型 * @return 一个包裹里元素可能为空的 {@code Opt} * @since 5.7.17 */ - public static > Opt ofEmptyAble(R value) { - return CollUtil.isEmpty(value) ? empty() : new Opt<>(value); + public static Opt> ofEmptyAble(List value) { + return CollectionUtil.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 4dc8efcee..ab9947744 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,7 +1,5 @@ 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; @@ -62,15 +60,4 @@ 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 e7bdc110d..89d6640d2 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,7 +1,5 @@ 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; @@ -36,12 +34,5 @@ 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()); } } From 238898e7084681ab8dc68fb1b0aff9fa4b2f36c6 Mon Sep 17 00:00:00 2001 From: VampireAchao Date: Mon, 7 Feb 2022 22:03:02 +0800 Subject: [PATCH 3/3] =?UTF-8?q?=E5=BF=98=E8=AE=B0=E5=8A=A0=E5=8D=95?= =?UTF-8?q?=E5=8F=82=E6=95=B0=E5=88=86=E7=BB=84=E9=87=8D=E8=BD=BD=E4=BA=86?= =?UTF-8?q?...=E5=A4=B1=E8=AF=AF=E5=A4=B1=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cn/hutool/core/stream/CollectorUtil.java | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/hutool-core/src/main/java/cn/hutool/core/stream/CollectorUtil.java b/hutool-core/src/main/java/cn/hutool/core/stream/CollectorUtil.java index 82821897d..8e4001df4 100644 --- a/hutool-core/src/main/java/cn/hutool/core/stream/CollectorUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/stream/CollectorUtil.java @@ -8,12 +8,15 @@ import java.util.EnumSet; import java.util.HashMap; import java.util.Map; import java.util.Set; +import java.util.List; import java.util.StringJoiner; import java.util.function.BiConsumer; import java.util.function.BinaryOperator; import java.util.function.Function; import java.util.function.Supplier; +import java.util.function.UnaryOperator; import java.util.stream.Collector; +import java.util.stream.Collectors; /** * 可变的汇聚操作{@link Collector} 相关工具封装 @@ -111,8 +114,7 @@ public class CollectorUtil { if (downstream.characteristics().contains(Collector.Characteristics.IDENTITY_FINISH)) { return new SimpleCollector<>(mangledFactory, accumulator, merger, CH_ID); } else { - @SuppressWarnings("unchecked") - Function downstreamFinisher = (Function) downstream.finisher(); + UnaryOperator downstreamFinisher = (UnaryOperator) downstream.finisher(); Function, M> finisher = intermediate -> { intermediate.replaceAll((k, v) -> downstreamFinisher.apply(v)); @SuppressWarnings("unchecked") @@ -140,6 +142,18 @@ public class CollectorUtil { return groupingBy(classifier, HashMap::new, downstream); } + /** + * 提供对null值友好的groupingBy操作的{@link Collector}实现 + * + * @param classifier 分组依据 + * @param 实体类型 + * @param 实体中的分组依据对应类型,也是Map中key的类型 + * @return {@link Collector} + */ + public static Collector>> + groupingBy(Function classifier) { + return groupingBy(classifier, Collectors.toList()); + } /** * 对null友好的 toMap 操作的 {@link Collector}实现,默认使用HashMap