目录
java.util.Optional
方法定义
1、获取与封装
get | 获取Optional的value,为null则抛出NoSuchElementException异常 | public T get() |
of | 将value封装为Optional对象,为null则抛出NullPointerException异常 | public static <T> Optional<T> of(T value) |
empty | 返回空Optional对象 | public static<T> Optional<T> empty() |
ofNullable | 将value封装为Optional对象,为null则将返回空对象 | public static <T> Optional<T> ofNullable(T value) |
2、null值判断处理
isPresent | 不为null返回true,否则返回false | public boolean isPresent() { return value != null; } |
ifPresent | value不为null则使用该值调用指定的使用者 | public void ifPresent(Consumer<? super T> consumer) |
orElse | 若对象的value不为null返回value,否则返回other | public T orElse(T other) |
orElseGet | 若对象的value不为null返回value,否则返回other.get() | public T orElseGet(Supplier<? extends T> other) |
orElseThrow | 若对象的value不为null返回value,否则supplier创建的异常 | public <X extends Throwable> T orElseThrow(Supplier<? extends X> exceptionSupplier) |
3、value处理(转换/过滤)
filter | 如果值存在,返回条件筛选后的Optional对象,否则返回空对象 | public Optional<T> filter(Predicate<? super T> predicate) |
map | 如果值存在,就对该值执行提供的mapping函数调用 | public<U> Optional<U> map(Function<? super T, ? extends U> mapper) |
flatMap | 如果值存在,就执行flatmap函数 |
使用场景
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class User {
private Long id;
private String name;
}
场景1:user对象不为空,获取id,为空需要返回0
//之前
Objects.isNull(user.getId()) ? 0L : user.getId();
//替换
Optional.ofNullable(user.getId()).orElse(0L);
场景2:如果user不为空,返回用户ID,为空需要返回0
//之前
if (Objects.nonNull(user)) {
return user.getId();
} else {
return 0L;
}
//替换
Optional.ofNullable(user).map(User::getId).orElse(0L);
场景3:如果user不为空,输出用户ID+用户name下划线隔开
//之前
if (Objects.nonNull(user)) {
System.out.println(user.getId() + "_" + user.getName());
}
//替换
Optional.ofNullable(user).ifPresent(user1 -> System.out.println(user1.getId() + "_" + user1.getName()));
场景4:找一个名叫张三的用户
//之前
List<User> filterUsers = list.stream().filter(user1 -> "张三".equals(user1.getName())).collect(Collectors.toList());
if (CollectionUtils.isNotEmpty(filterUsers)) {
User user = filterUsers.get(0);
System.out.println(user.getId() + "_" + user.getName());
}
//替换
Optional<User> filterUsers = list.stream().filter(user1 -> "张三".equals(user1.getName())).findAny();
if (filterUsers.isPresent()) {
User user = filterUsers.get();
System.out.println(user.getId() + "_" + user.getName());
}