add method

This commit is contained in:
Looly 2021-11-07 13:10:18 +08:00
parent 96df45120d
commit fbf52763b7
3 changed files with 32 additions and 36 deletions

View File

@ -26,6 +26,7 @@
* 【core 】 TreeUtil增加walk方法pr#1932@Gitee
* 【crypto 】 SmUtil增加sm3WithSaltpr#454@Gitee
* 【http 】 增加HttpInterceptorissue#I4H1ZV@Gitee
* 【core 】 Opt增加flattedMapissue#I4H1ZV@Gitee
### 🐞Bug修复
* 【core 】 修复UrlBuilder.addPath歧义问题issue#1912@Github

View File

@ -50,20 +50,6 @@ public class Opt<T> {
*/
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<T> {
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<T> {
return value;
}
/**
* 以非静态方式获取一个新的 {@code Opt}
*
* @param value
* @return 新的 {@code Opt}
*/
public Opt<T> set(T value) {
return Opt.ofNullable(value);
}
/**
* 判断包裹里元素的值是否存在存在为 {@code true}否则为{@code false}
*
@ -263,15 +253,15 @@ public class Opt<T> {
* @return 如果包裹里的值存在就执行传入的操作({@link Function#apply})并返回该操作返回值
* 如果不存在返回一个空的{@code Opt}
* @throws NullPointerException 如果给定的操作为 {@code null}或者给定的操作执行结果为 {@code null}抛出 {@code NPE}
* @see Optional#flatMap(Function)
* @since 5.7.16
*/
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)));
return ofNullable(mapper.apply(value).orElse(null));
}
}
@ -428,6 +418,15 @@ public class Opt<T> {
}
}
/**
* 转换为 {@link Optional}对象
* @return {@link Optional}对象
* @since 5.7.16
*/
public Optional<T> toOptional(){
return Optional.ofNullable(this.value);
}
/**
* 判断传入参数是否与 {@code Opt}相等
* 在以下情况下返回true

View File

@ -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