From 29d503d27475e5926047e5252033c44d5008c589 Mon Sep 17 00:00:00 2001 From: achao Date: Sat, 6 Nov 2021 19:56:40 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E4=BA=86flattedMap=EF=BC=8C?= =?UTF-8?q?=E5=A2=9E=E5=BC=BA=E4=BA=86=E5=AF=B9=E5=8E=9F=E7=94=9FOptional?= =?UTF-8?q?=E7=9A=84=E9=80=82=E9=85=8D=20=E6=96=B0=E5=A2=9E=E4=BA=86set?= =?UTF-8?q?=E5=87=BD=E6=95=B0=EF=BC=8C=E8=83=BD=E9=80=9A=E8=BF=87=E9=9D=9E?= =?UTF-8?q?=E9=9D=99=E6=80=81=E6=96=B9=E5=BC=8F=E4=BB=A5=E5=8F=8A=E9=93=BE?= =?UTF-8?q?=E5=BC=8F=E8=8E=B7=E5=8F=96=E6=96=B0=E7=9A=84Opt?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/cn/hutool/core/lang/Opt.java | 33 +++++++++++++++++++ .../java/cn/hutool/core/lang/OptTest.java | 20 +++++++++++ 2 files changed, 53 insertions(+) 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 03439091f..707a922dd 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 @@ -29,6 +29,7 @@ import cn.hutool.core.util.StrUtil; import java.util.NoSuchElementException; import java.util.Objects; +import java.util.Optional; import java.util.function.Consumer; import java.util.function.Function; import java.util.function.Predicate; @@ -125,6 +126,16 @@ public class Opt { return value; } + /** + * 以非静态方式获取一个新的 {@code Opt} + * + * @param value 值 + * @return 新的 {@code Opt} + */ + public Opt set(T value) { + return Opt.ofNullable(value); + } + /** * 判断包裹里元素的值是否存在,存在为 {@code true},否则为{@code false} * @@ -242,6 +253,28 @@ public class Opt { } } + /** + * 如果包裹里的值存在,就执行传入的操作({@link Function#apply})并返回该操作返回值 + * 如果不存在,返回一个空的{@code Opt} + * 和 {@link Opt#map}的区别为 传入的操作返回值必须为 {@link Optional} + * + * @param mapper 值存在时执行的操作 + * @param 操作返回值的类型 + * @return 如果包裹里的值存在,就执行传入的操作({@link Function#apply})并返回该操作返回值 + * 如果不存在,返回一个空的{@code Opt} + * @throws NullPointerException 如果给定的操作为 {@code null}或者给定的操作执行结果为 {@code null},抛出 {@code NPE} + */ + public Opt flattedMap(Function> mapper) { + Objects.requireNonNull(mapper); + if (isEmpty()) { + return empty(); + } else { + @SuppressWarnings("unchecked") + Optional r = (Optional) mapper.apply(value); + return Objects.requireNonNull(ofNullable(r.orElse(null))); + } + } + /** * 如果包裹里元素的值存在,就执行对应的操作,并返回本身 * 如果不存在,返回一个空的{@code Opt} diff --git a/hutool-core/src/test/java/cn/hutool/core/lang/OptTest.java b/hutool-core/src/test/java/cn/hutool/core/lang/OptTest.java index 647b86882..07ea9eccb 100644 --- a/hutool-core/src/test/java/cn/hutool/core/lang/OptTest.java +++ b/hutool-core/src/test/java/cn/hutool/core/lang/OptTest.java @@ -8,6 +8,8 @@ import org.junit.Assert; import org.junit.Ignore; import org.junit.Test; +import java.util.ArrayList; +import java.util.List; import java.util.NoSuchElementException; import java.util.function.Consumer; import java.util.stream.Stream; @@ -132,6 +134,24 @@ public class OptTest { Assert.assertNull(exceptionWithMessage); } + @Test + public void flattedMapTest() { + // 和Optional兼容的flatMap + List userList = new ArrayList<>(); + // 以前,不兼容 +// Opt.ofNullable(userList).map(List::stream).flatMap(Stream::findFirst); + // 现在,兼容 + User user = Opt.ofNullable(userList).map(List::stream).flattedMap(Stream::findFirst).orElseGet(User.builder()::build); + System.out.println(user); + } + + @Test + public void setTest() { + // 我一直在想,既然有get,为什么不能有set呢? + Opt.ofNullable(User.builder().username("ruben").build()).peek(System.out::println) + .set(User.builder().username("hutool").build()).peek(System.out::println); + } + @Data @Builder @NoArgsConstructor