关于后端:Java-Optional的基础使用解决空指针及非空判断

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");
             }
         });

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理