Optional主要是为了解决 NullPointerException (空指针异常) 的问题。
一般我们在处理空指针异常的问题都会使用条件判断语句,然后再进行操作。
这种其实理论上并没有什么问题,但是它会带来深度嵌套的问题,导致代码膨胀从而导致代码可读性十分糟糕。
创建optional对象
1. 声明一个空的 Optional
Optional<Object> opt = Optional.empty();
2. 依据一个非空值创建 Optional
Optional<Object> opt = Optional.of(value);
// if value is null will throw NullPointerExeption
3. 可接受null的 Optional
Optional<Object> opt = Optional.ofNullable(value);
// if valuse is null. opt will get an empty value
4. 使用map从 Optional对象中提取值
Optional<Object1> optObject = Optional.ofNullable(object1);
Optional<Object2> opt = optObject.map(Object1 :: getObject2);
这种仅能在操作一个对象时使用,多个对象时无法使用。
比如以下案例
public String getCarInsuranceName(Person person) { return person.getCar().getInsurance().getname(); }
如果使用map方式是使用可能是
Optional<Person> optPerson = Optional.of(person); Optional<String> name = optPerson.map(Person::getCar) .map(Car::getInsurance) .map(Insurance::getName);
但是这种方法会报错。首先 optPerson是Optional<Person>类型的变量。
通过map方法操作的结果是一个Optional<Car> 类型的对象,此时一位着,map操作了一个 Optional<Optional<Car>> 。此时去调用 getInsurance 就是一个非法操作了。
5. 使用flatMap 链接 Optional 对象
用于连接多个对象的情况
Optional<Person> optPerson = Optional.of(person);
Optional<String> name = optPerson.flatMap(Person::getCar)
.flatMap(Car::getInsurance)
.map(Insurance::getName)
.orElse("Unknow");