• 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(Function mapper) {
            Objects.requireNonNull(mapper);
            if (!isPresent()) {
                return empty();
            } else {
                //  返回值使用Optional包装
                return Optional.ofNullable(mapper.apply(value));
            }
        }

    flatMap

    public  Optional flatMap(Function> mapper) {
            Objects.requireNonNull(mapper);
            if (!isPresent()) {
                return empty();
            } else {
                @SuppressWarnings("unchecked")
                Optional r = (Optional) mapper.apply(value);
                // 返回值没有包装,直接是Optional对象,只做了一次判null
                return Objects.requireNonNull(r);
            }
        }
  • 相关阅读:
    C语言求方程根
    Xinlinx zynq7045国产替代 FMQL45T900全国产化 ARM开发板
    弘辽科技:拼多多上下架会不会影响到流量?时间如何安排?
    web界面无操作实现自动锁屏
    Word处理控件Aspose.Words功能演示:使用Java合并MS Word文档
    [Git] 系列四Push & Pull —— Git 远程仓库和高级操作
    MAC层协议总结
    ThreadPoolExecutor详解
    高并发-防止雪崩与穿透
    【广州华锐互动】屠宰场生猪检疫VR模拟演练系统
  • 原文地址:https://blog.csdn.net/AS011x/article/details/126947175