From fbf52763b7a6eb31bb8f254534823fb585bac0ce Mon Sep 17 00:00:00 2001 From: Looly Date: Sun, 7 Nov 2021 13:10:18 +0800 Subject: [PATCH] add method --- CHANGELOG.md | 1 + .../main/java/cn/hutool/core/lang/Opt.java | 53 +++++++++---------- .../java/cn/hutool/core/lang/OptTest.java | 14 ++--- 3 files changed, 32 insertions(+), 36 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f1c5df6e0..b205cb0d4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -26,6 +26,7 @@ * 【core 】 TreeUtil增加walk方法(pr#1932@Gitee) * 【crypto 】 SmUtil增加sm3WithSalt(pr#454@Gitee) * 【http 】 增加HttpInterceptor(issue#I4H1ZV@Gitee) +* 【core 】 Opt增加flattedMap(issue#I4H1ZV@Gitee) ### 🐞Bug修复 * 【core 】 修复UrlBuilder.addPath歧义问题(issue#1912@Github) 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 d5f75bab9..e4bfe9e80 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 @@ -50,20 +50,6 @@ public class Opt { */ private static final Opt EMPTY = new Opt<>(null); - /** - * 包裹里实际的元素 - */ - private final T value; - - /** - * {@code Opt}的构造函数 - * - * @param value 包裹里的元素 - */ - private Opt(T value) { - this.value = value; - } - /** * 返回一个空的{@code Opt} * @@ -111,6 +97,20 @@ public class Opt { return StrUtil.isBlankIfStr(value) ? empty() : new Opt<>(value); } + /** + * 包裹里实际的元素 + */ + private final T value; + + /** + * {@code Opt}的构造函数 + * + * @param value 包裹里的元素 + */ + private Opt(T value) { + this.value = value; + } + /** * 返回包裹里的元素,取不到则为{@code null},注意!!!此处和{@link java.util.Optional#get()}不同的一点是本方法并不会抛出{@code NoSuchElementException} * 如果元素为空,则返回{@code null},如果需要一个绝对不能为{@code null}的值,则使用{@link #orElseThrow()} @@ -126,16 +126,6 @@ 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} * @@ -263,15 +253,15 @@ public class Opt { * @return 如果包裹里的值存在,就执行传入的操作({@link Function#apply})并返回该操作返回值 * 如果不存在,返回一个空的{@code Opt} * @throws NullPointerException 如果给定的操作为 {@code null}或者给定的操作执行结果为 {@code null},抛出 {@code NPE} + * @see Optional#flatMap(Function) + * @since 5.7.16 */ 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))); + return ofNullable(mapper.apply(value).orElse(null)); } } @@ -428,6 +418,15 @@ public class Opt { } } + /** + * 转换为 {@link Optional}对象 + * @return {@link Optional}对象 + * @since 5.7.16 + */ + public Optional toOptional(){ + return Optional.ofNullable(this.value); + } + /** * 判断传入参数是否与 {@code Opt}相等 * 在以下情况下返回true 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 7af6a4f04..0da48a24a 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 @@ -11,6 +11,7 @@ import org.junit.Test; import java.util.ArrayList; import java.util.List; import java.util.NoSuchElementException; +import java.util.stream.Stream; /** * {@link Opt}的单元测试 @@ -135,15 +136,10 @@ public class OptTest { // 以前,不兼容 // 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); + User user = Opt.ofNullable(userList).map(List::stream) + .flattedMap(Stream::findFirst).orElseGet(User.builder()::build); + Assert.assertNull(user.getUsername()); + Assert.assertNull(user.getNickname()); } @Data