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 6a349256e3507a09f433e13bc96188b78b79f3e1..6af6f9a24b0fcf1378b8845d81aedc54f38858b9 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 @@ -229,6 +229,30 @@ public class Opt { return this; } + /** + * 如果包裹里的值存在,就执行传入的操作, 如果不存在直接给一个默认值({@link Function#apply(Object)}) + * + *

+ * 作用:简化api,如此高频api ifPresent没有返回、没有默认值用起来不方便, + * 设置默认还得写ifPresent OrElse ({@link Optional#orElse(Object)}) + *

{@code Opt.ofNullable(xxxObj).ifPresent(xxxObj::yyMethod, DEFAULT_ZZZ)}
+ *

+ * + * @param mapper 值存在时执行的操作 + * @param defaultValue 值不存在时的默认值 + * @param 操作返回值的类型 + * @return 返回包裹类型的Opt + * @throws NullPointerException 如果给定的mapper操作为 {@code null},抛出 {@code NPE} + */ + public Opt ifPresent(Function mapper, T defaultValue) { + Objects.requireNonNull(mapper); + if (isPresent()) { + return Opt.ofNullable(mapper.apply(value)); + } else { + return Opt.ofNullable(mapper.apply(defaultValue)); + } + } + /** * 判断包裹里的值存在并且与给定的条件是否满足 ({@link Predicate#test}执行结果是否为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 f1542d46a0f5c3ac96bf6a4fcb500282aafd37f2..be859d36d05d87a679809ded7c7136dc9a0420e9 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 @@ -31,6 +31,15 @@ public class OptTest { Assert.assertEquals("hutool", hutool); } + @Test + public void ifPresentAndDefaultTest() { + String username = null; + final User user = new User(); + // 相当于ifPresent的链式调用 + Opt opt = Opt.ofNullable(username).ifPresent(user::name, "hutool"); + Assert.assertEquals("hutool", opt.get().getUsername()); + } + @Test public void getTest() { // 和原版Optional有区别的是,get不会抛出NoSuchElementException @@ -199,5 +208,10 @@ public class OptTest { static class User { private String username; private String nickname; + + public User name(String username) { + this.username = username; + return this; + } } }