!455 新增了 flattedMap函数,增强了对原生Optional的适配;新增了set函数,允许静态方式/链式获取一个新的Opt

Merge pull request !455 from 阿超/v5-dev
This commit is contained in:
Looly 2021-11-07 04:46:50 +00:00 committed by Gitee
commit 96df45120d
2 changed files with 53 additions and 0 deletions

View File

@ -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<T> {
return value;
}
/**
* 以非静态方式获取一个新的 {@code Opt}
*
* @param value
* @return 新的 {@code Opt}
*/
public Opt<T> set(T value) {
return Opt.ofNullable(value);
}
/**
* 判断包裹里元素的值是否存在存在为 {@code true}否则为{@code false}
*
@ -242,6 +253,28 @@ public class Opt<T> {
}
}
/**
* 如果包裹里的值存在就执行传入的操作({@link Function#apply})并返回该操作返回值
* 如果不存在返回一个空的{@code Opt}
* {@link Opt#map}的区别为 传入的操作返回值必须为 {@link Optional}
*
* @param mapper 值存在时执行的操作
* @param <U> 操作返回值的类型
* @return 如果包裹里的值存在就执行传入的操作({@link Function#apply})并返回该操作返回值
* 如果不存在返回一个空的{@code Opt}
* @throws NullPointerException 如果给定的操作为 {@code null}或者给定的操作执行结果为 {@code null}抛出 {@code NPE}
*/
public <U> Opt<U> flattedMap(Function<? super T, ? extends Optional<? extends U>> mapper) {
Objects.requireNonNull(mapper);
if (isEmpty()) {
return empty();
} else {
@SuppressWarnings("unchecked")
Optional<U> r = (Optional<U>) mapper.apply(value);
return Objects.requireNonNull(ofNullable(r.orElse(null)));
}
}
/**
* 如果包裹里元素的值存在就执行对应的操作并返回本身
* 如果不存在返回一个空的{@code Opt}

View File

@ -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;
/**
@ -126,6 +128,24 @@ public class OptTest {
Assert.assertNull(exceptionWithMessage);
}
@Test
public void flattedMapTest() {
// 和Optional兼容的flatMap
List<User> 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