java8-Optional的引入

背景

NPE问题,100%的Java程序员都碰到,并且曾经是心中的痛。

1965年英国TonyHoare引入了Null引用,后续的设计语言包括Java都保持了这种设计。

一个例子

业务模型

Person 有车一族, 有Car字段,

Car 车,每个车都有购买保险, 有Insurance字段;

Insurance 保险,每个保险都有名字 有name字段;

需求:获取某个Person对象的购买保险的名称;

常规编程

    public String getCarInsuranceName(Person person) {
        return person.getCar().getInsurance().getName();
    }

---检查式编程

 public String getCarInsuranceName_check(Person person) {
        if (Objects.nonNull(person)) {
            final Car car = person.getCar();
            if (Objects.nonNull(car)) {
                final Insurance insurance = car.getInsurance();
                if (Objects.nonNull(insurance)) {
                    return insurance.getName();
                }
            }
        }
        return "unkown";
    }

---

防御式编程

public String getCarInsuranceName_protect(Person person) {
        if (Objects.isNull(person)) {
            return "unkown";
        }
        final Car car = person.getCar();
        if (Objects.isNull(car)) {
            return "unkown";
        }
        final Insurance insurance = car.getInsurance();
        if (Objects.isNull(insurance)) {
            return "unkown";
        }
        return insurance.getName();
    }

---

对比一下缺点:

编程方法缺点
常规编程NPE问题
检查式编程1.可读性不好,多层if嵌套; 2.扩展性不好,需要熟悉全流程,否则不知道应该在哪个if中扩展,极易出错;
防御式编程1. 维护困难,4个不同的退出点,极易出错,容易遗漏检查项目

NPE的痛点

1. java程序中出现最多的Exception;没有之一;

2. 使得代码量膨胀混乱,对象的空判断充斥在代码中,但是却没有实际的业务意义;

3. 类型系统的一个后门,实际上不属于任何类型,也可以说是任何类型;

4. 本身无意义,标识对缺失值的建模,也破坏了java中弱化指针的理念。

java8中对缺失值的建模对象是Optional,可以基于它解决NPE的痛点,设计更好的API

Optional

领域模型的建模进化

  1. Person , 含有一个Optional car字段,一个人可能有车,也可能没有车;
  2. Car, 包含有一个Optional insurance字段, 一台车可能买了保险,也可能没有买保险;
  3. Insurance , 保险公司必定有名字所有,他有一个字段 name;

构造方法

构造方法说明备注
Optional.empty()一定是空的对象跟null有区别,是一个单例对象
Optional.of(T t)一定是不空的对象如果给了null值会立刻抛出NPE
Optioanl.ofNullable(T t)允许为空的对象放在里面使用值之前需要做检查

map方法-对象中提取和转换值

原创不易,转载请注明出处,欢迎多沟通交流

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java 8引入Optional类,它是一个容器对象,可以包含或者不包含非空值。Optional类主要用于解决空指针异常的问题,它提供了一种优雅的方式来处理可能为空的值。 下面是Java 8 Optional的使用方式: 1. 创建Optional对象: - 使用静态方法`Optional.of(value)`创建一个包含非空值的Optional对象。 - 使用静态方法`Optional.empty()`创建一个空的Optional对象。 - 使用静态方法`Optional.ofNullable(value)`创建一个包含可能为空值的Optional对象。 2. 判断Optional对象是否包含值: - 使用`isPresent()`方法判断Optional对象是否包含非空值。 - 使用`isEmpty()`方法判断Optional对象是否为空。 3. 获取Optional对象的值: - 使用`get()`方法获取Optional对象中的值。注意:如果Optional对象为空,调用`get()`方法会抛出NoSuchElementException异常。 4. 处理Optional对象的值: - 使用`ifPresent(Consumer<? super T> consumer)`方法,传入一个Consumer函数式接口来处理Optional对象中的值。如果Optional对象非空,则执行传入的Consumer接口中的逻辑。 - 使用`orElse(T other)`方法,如果Optional对象为空,则返回传入的默认值other。 - 使用`orElseGet(Supplier<? extends T> other)`方法,如果Optional对象为空,则通过传入的Supplier函数式接口生成一个默认值。 - 使用`orElseThrow(Supplier<? extends X> exceptionSupplier)`方法,如果Optional对象为空,则通过传入的Supplier函数式接口抛出一个异常。 5. 使用Optional进行链式调用: - 使用`map(Function<? super T, ? extends U> mapper)`方法,传入一个Function函数式接口来对Optional对象中的值进行转换。 - 使用`flatMap(Function<? super T, Optional<U>> mapper)`方法,传入一个Function函数式接口来对Optional对象中的值进行转换,并返回一个新的Optional对象。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值