• Java中的Optional


    在我们日常的开发中,我们经常会遇到 NullPointerException。如何才能优雅的处理NPE?这里告诉大家一个较为流行的方法

    java.util.Optional

    使用Optional来修饰对象,表示这个对象可能为null。在使用时,就要加以注意,必须要考虑该值为null的场景。

    使用Optional构建对象

            // 创建一个空的car
            Optional car = Optional.empty();
    
            // 使用of创建,of的值一定不能是null,否则赋值阶段就报 NullPointerException
            /**
             *  if (obj == null)
             *             throw new NullPointerException();
             */
            Car car1 = new Car();
            Optional ocar1 = Optional.of(car1);
    
            // 创建一个可以为null的Optional,该方法支持car为null,但是会在用到car的地方抛出异常,但不是空指针异常。
            Car car2 = new Car();
            Optional ocar2 = Optional.ofNullable(car2);
            System.out.println(ocar2.get());
            Optional ocar22 = Optional.ofNullable(null);
    

    获取Optional中的对象

    1. get: 这是最不安全的方法。如果变量存在就返回,不存在的话则会抛出NoSuchElementException的异常。所以,get()的使用场景一定是十分确定Optional修饰的值一定是有内容的,否则不建议使用。
            /**
             * public T get() {
             *         if (value == null) {
             *             throw new NoSuchElementException("No value present");
             *         }
             *         return value;
             *     }
             */
            String name = car.getInsurance().get().getName();
            System.out.println(name);
    
    1. orElse: 作用和get一样,但是没有值时可以使用默认值
            /**
             *     public T orElse(T other) {
             *         return value != null ? value : other;
             *     }
             */
            String orName = car.getInsurance().orElse(new Insurance()).getName();
            System.out.println(orName);
    
    1. orElseGet: orElse的延时版本。只有当val为空时,才会创建defleat value
            /**
             * public T orElseGet(Supplier supplier) {
             *         return value != null ? value : supplier.get();
             *     }
             */
            String getElseName = car.getInsurance().orElseGet(Insurance::new).getName();
            System.out.println("getElseName " + getElseName);
    
    1. orElseThrow: 和orElse类似,只是当value不存在时抛出异常
        public T orElseThrow() {
            if (value == null) {
                throw new NoSuchElementException("No value present");
            }
            return value;
        }
    
    1. ifPresent: 判断值存在之后再操作,不存在就不操作
            /**
             * public void ifPresent(Consumer action) {
             *         if (value != null) {
             *             action.accept(value);
             *         }
             *     }
             */
            car.getInsurance().ifPresent(ins -> {
                String pname = ins.getName();
                System.out.println("inPresent " + pname);
            });
    

    Optional 中map和flatmap的差别

    Optional> mCar = optionalPerson.map(Person::getCar);
    Optional flatMapCap = optionalPerson.flatMap(Person::getCar);
    

    map

        public  Optional map(Functionsuper T, ? extends U> mapper) {
            Objects.requireNonNull(mapper);
            if (!isPresent()) {
                return empty();
            } else {
                //  返回值使用Optional包装
                return Optional.ofNullable(mapper.apply(value));
            }
        }
    

    flatMap

        public  Optional flatMap(Functionsuper T, ? extends Optional> mapper) {
            Objects.requireNonNull(mapper);
            if (!isPresent()) {
                return empty();
            } else {
                @SuppressWarnings("unchecked")
                Optional r = (Optional) mapper.apply(value);
                // 返回值没有包装,直接是Optional对象,只做了一次判null
                return Objects.requireNonNull(r);
            }
        }
    
  • 相关阅读:
    设计模式学习笔记(十七)中介者模式及其应用场景
    一键搭建博客:如何使用WordPress插件搭建专属博客
    最优化方法——Matlab实现黄金分割法一维搜索
    数字藏品市场持续火热,元宇宙电商-NFG系统是如何流通和溯源?
    C# - readonly 和 const 关键字
    netty
    基于黏菌优化的BP神经网络(分类应用) - 附代码
    【组件】Vue组件之间的通信父传子 | 子传父
    测试登录界面:Python
    pytroch实战12:基于pytorch的网络结构可视化
  • 原文地址:https://www.cnblogs.com/hardyzhou/p/16709201.html