From 7eb5b82ec56d4d00f833f6a47d9f346d2e68c809 Mon Sep 17 00:00:00 2001 From: kongweiguang Date: Thu, 28 Dec 2023 20:24:22 +0800 Subject: [PATCH 1/2] =?UTF-8?q?fix:=20opt=E7=9A=84map=E6=96=B9=E6=B3=95?= =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=A4=B1=E8=B4=A5=E5=88=A4=E6=96=AD=EF=BC=8C?= =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E5=A6=82=E6=9E=9C=E4=BD=BF=E7=94=A8ofTry?= =?UTF-8?q?=EF=BC=8C=E6=89=A7=E8=A1=8C=E5=A4=B1=E8=B4=A5=EF=BC=8C=E8=B0=83?= =?UTF-8?q?=E7=94=A8map=E6=96=B9=E6=B3=95=E5=90=8E=E5=86=8D=E8=B0=83?= =?UTF-8?q?=E7=94=A8ifFail=E6=96=B9=E6=B3=95=E5=A4=B1=E6=95=88=E7=9A=84?= =?UTF-8?q?=E9=97=AE=E9=A2=98=20add:=20=E6=B7=BB=E5=8A=A0toEasyStream?= =?UTF-8?q?=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../org/dromara/hutool/core/lang/Opt.java | 37 ++++++++++++++----- 1 file changed, 27 insertions(+), 10 deletions(-) diff --git a/hutool-core/src/main/java/org/dromara/hutool/core/lang/Opt.java b/hutool-core/src/main/java/org/dromara/hutool/core/lang/Opt.java index 92a111cda..a7023e3da 100644 --- a/hutool-core/src/main/java/org/dromara/hutool/core/lang/Opt.java +++ b/hutool-core/src/main/java/org/dromara/hutool/core/lang/Opt.java @@ -73,8 +73,7 @@ public class Opt { * @return 一个包裹里元素可能为空的 {@code Opt} */ public static Opt ofNullable(final T value) { - return value == null ? empty() - : new Opt<>(value); + return value == null ? empty() : new Opt<>(value); } /** @@ -108,7 +107,7 @@ public class Opt { */ public static Opt ofTry(final SerSupplier supplier) { try { - return Opt.ofNullable(supplier.getting()); + return ofNullable(supplier.getting()); } catch (final Throwable e) { final Opt empty = new Opt<>(null); empty.throwable = e; @@ -276,7 +275,7 @@ public class Opt { */ public Opt filter(final Predicate predicate) { Objects.requireNonNull(predicate); - if (isEmpty()) { + if (isEmpty() || isFail()) { return this; } else { return predicate.test(value) ? this : empty(); @@ -293,9 +292,12 @@ public class Opt { * 如果不存在,返回一个空的{@code Opt} * @throws NullPointerException 如果给定的操作为 {@code null},抛出 {@code NPE} */ + @SuppressWarnings("unchecked") public Opt map(final Function mapper) { Objects.requireNonNull(mapper); - if (isEmpty()) { + if (isFail()) { + return (Opt) this; + } else if (isEmpty()) { return empty(); } else { return Opt.ofNullable(mapper.apply(value)); @@ -313,9 +315,12 @@ public class Opt { * 如果不存在,返回一个空的{@code Opt} * @throws NullPointerException 如果给定的操作为 {@code null}或者给定的操作执行结果为 {@code null},抛出 {@code NPE} */ + @SuppressWarnings("unchecked") public Opt flatMap(final Function> mapper) { Objects.requireNonNull(mapper); - if (isEmpty()) { + if (isFail()) { + return (Opt) this; + } else if (isEmpty()) { return empty(); } else { @SuppressWarnings("unchecked") final Opt r = (Opt) mapper.apply(value); @@ -336,9 +341,12 @@ public class Opt { * @see Optional#flatMap(Function) * @since 5.7.16 */ + @SuppressWarnings("unchecked") public Opt flattedMap(final Function> mapper) { Objects.requireNonNull(mapper); - if (isEmpty()) { + if (isFail()) { + return (Opt) this; + } else if (isEmpty()) { return empty(); } else { return ofNullable(mapper.apply(value).orElse(null)); @@ -456,7 +464,7 @@ public class Opt { * @throws NullPointerException 如果之不存在,并且传入的操作为空,则抛出 {@code NPE} */ public Opt orElseOpt(final Supplier supplier) { - return or(() -> Opt.ofNullable(supplier.get())); + return or(() -> ofNullable(supplier.get())); } /** @@ -510,7 +518,16 @@ public class Opt { * @since 5.7.16 */ public Optional toOptional() { - return Optional.ofNullable(this.value); + return Optional.ofNullable(value); + } + + /** + * 转换为 {@link EasyStream}对象 + * + * @return {@link EasyStream}对象 + */ + public EasyStream toEasyStream() { + return EasyStream.of(value); } /** @@ -558,6 +575,6 @@ public class Opt { */ @Override public String toString() { - return StrUtil.toStringOrNull(this.value); + return StrUtil.toStringOrNull(value); } } From c36f27308a362ffb1394bf3e8964c3d356a90dc4 Mon Sep 17 00:00:00 2001 From: kongweiguang Date: Thu, 28 Dec 2023 20:28:33 +0800 Subject: [PATCH 2/2] =?UTF-8?q?add:=20test=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../org/dromara/hutool/core/lang/OptTest.java | 32 +++++++++++++++++-- 1 file changed, 30 insertions(+), 2 deletions(-) diff --git a/hutool-core/src/test/java/org/dromara/hutool/core/lang/OptTest.java b/hutool-core/src/test/java/org/dromara/hutool/core/lang/OptTest.java index 41ce9123b..7b6efb86d 100644 --- a/hutool-core/src/test/java/org/dromara/hutool/core/lang/OptTest.java +++ b/hutool-core/src/test/java/org/dromara/hutool/core/lang/OptTest.java @@ -12,17 +12,24 @@ package org.dromara.hutool.core.lang; -import org.dromara.hutool.core.collection.CollUtil; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; +import org.dromara.hutool.core.collection.CollUtil; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; import javax.management.monitor.MonitorSettingException; -import java.util.*; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.NoSuchElementException; +import java.util.Optional; import java.util.stream.Stream; /** @@ -234,4 +241,25 @@ public class OptTest { .ifFail(Console::log, NullPointerException.class, MonitorSettingException.class) ; } + + + @SuppressWarnings({"NumericOverflow", "divzero"}) + @Test + @Disabled + void testFail1() { + final Integer i = Opt.ofTry(() -> 1 / 0) + .map(e -> 666) + .ifFail(Console::log) + .orElseGet(() -> 1); + Assertions.assertEquals(i, 1); + } + + @SuppressWarnings({"NumericOverflow", "divzero"}) + @Test + @Disabled + void testToEasyStream() { + final List list = Opt.ofTry(() -> 1).toEasyStream().toList(); + Assertions.assertArrayEquals(list.toArray(), new Integer[]{1}); + } + }