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 super T, ? extends U> 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;
+ }
}
}