Optional 是 Java8 自带的一个工具类,次要解决的是空指针以及非空的 if 校验 如上面这种代码
// 这种代码
if (user != null && user.getUserAddress() != null){// 逻辑}
根底应用
一
第一步把要校验的类传入 获取 Optional<T> 实体类 应用.of 获取实体类是要保障传入的实体类不为空,不然会报错
Optional<User> userOptional = Optional.ofNullable(user);
Optional<User> userOptional = Optional.of(user); //user 为空会报错
二
应用.map()办法校验其中的某个字段不为空,可用嵌套校验
userOptional.map() // 校验类其中的某个属性不为空,并且返回该属性的 Optional<T>
Optional<UserAddress> userAddress = Optional.ofNullable(user).map(new Function<User, UserAddress>() {
@Override
public UserAddress apply(User user) {return user.getUserAddress();
}
});
UserAddress address = userAddress.get();
map 办法接管一个 Function 接口,重写其中的 apply 办法,Function<User, UserAddress> 传入的两个类,第一个为 apply 的入参,第二个为 apply 的返回值
咱们可用应用 lambda 表达式进行的一个简化写法,不会简化的可用像我一样,把整个外部类代码写完后在 idea 提醒的有效代码 (灰色) 按 alt+ enter,会弹出 Replace with lambda 选项
选中后会主动转换为 lambda 表达式
前面在浅黄色提醒处应用同样的办法还能够简化
当然,前面可用通过链式编程 减少多个 map 嵌套校验
// 校验 User 中的 UserAddress 中的 DetailedAddress 参数
Optional.ofNullable(user).map(User::getUserAddress).map(new Function<UserAddress, String>() {
@Override
public String apply(UserAddress address) {return address.getDetailedAddress();
}
});
map 和 flatMap 的区别就是 返回值的区别 flatMap 会有个解包的过程,map 没有
Optional<String> s1 = optional.flatMap(user2 -> getTest(user2));
Optional<Optional<String>> s2 = optional.map(user2 -> getTest(user2));
private static Optional<String> getTest(User user){return Optional.ofNullable(user).map(User::getUserAddress).map(UserAddress::getDetailedAddress);
}
三
在链式 map 后应用 .orElse() .orElseGet() .orElseThrow() .ifPresent() .filter() 操作
orElse(T other):如果 optional 不为空,则返回 optional 中的对象;如果为 null,则返回 other 这个默认值
orElseGet(Supplier<T> other):如果 optional 不为空,则返回 optional 中的对象;如果为 null,则应用 Supplier 函数生成默认值 other
orElseThrow(Supplier<X> exception):如果 optional 不为空,则返回 optional 中的对象;如果为 null,则抛出 Supplier 函数生成的异样(能够自定义异样,做个全局异样拦截器封装返回数据)
Optional.ofNullable(user).map(User::getUserAddress).map(UserAddress::getDetailedAddress).orElse("测试地址");
Optional.ofNullable(user).map(User::getUserAddress).map(UserAddress::getDetailedAddress).orElseGet(()->"测试地址");
Optional.ofNullable(user).map(User::getUserAddress).map(UserAddress::getDetailedAddress).orElseThrow(()->new RuntimeException("报错"));
orElse 与 orElseGet 的区别就是.orElseGet 有短路,只有后面的对象为空才会调用,orElse 则都会调用,orElse 和 orElseGet 相当于 饿汉式和懒汉式
isPresent():判断 optional 是否为空,如果空则返回 false,否则返回 true
ifPresent(Consumer c):如果 optional 不为空,则将 optional 中的对象传给 Comsumer 函数
Optional.ofNullable(user).ifPresent(new Consumer<User>() {
@Override
public void accept(User user) {//user 不为空执行的逻辑}
});
filter():过滤
Optional.ofNullable(user).map(User::getUserAddress).map(UserAddress::getDetailedAddress).filter(new Predicate<String>() {
@Override
public boolean test(String s) {
// 过滤逻辑
return s.equals("sss");
}
});