版权声明:随意转载,请勿商用。转载请注明出处,谢谢。 https://blog.csdn.net/xinhongyang/article/details/86649614
Optional的操作
创建Optional对象
- 声明一个空的Optional
Optional<Car> opCar = Optional.empty();
- 根据一个非空值创建Optional
//如果car为null,会在这里直接报NPE错误。
Optional<Car> optCar = Optional.of(car);
- 可接受null的Optional
//如果cat为null,就返回一个空的Optional对象
Optional<Car> optCar = Optional.ofNullable(car);
使用map从Optional对象中提取和转换值
Optional<Insurance> optInsurance = Optional.ofNullable(insurance);
Optional<String> name = optInsurance.map(Insurance::getName);
使用flatMap链接Optional对象
先看错误例子:
Optional<Person> optPerson = Optional.of(person);
/**
* getCar返回的是Optional<Car>方法,因此map之后的结果为Optional<Optional<Car>>的对象,没法进行下一步操作。
**/
Optional<String> name =
optPerson.map(Person::getCar)
.map(Car::getInsurance)
.map(Insurance::getName);
正确的例子如下:
Optional<String> name =
optPerson.flatMap(Person::getCar)
.flatMap(Car::getInsurance)
.map(Insurance::getName);
获取包装类的内部值
//当name为空的时候,返回“Unknown”
String name =
optPerson.flatMap(Person::getCar)
.flatMap(Car::getInsurance)
.map(Insurance::getName)
.orElse("Unknown");
Optional类还提供了其他方法读取变量值:
/**
* 如果变量存在返回变量,否则抛出NoSuchElementException
**/
get();
/**
* 是orElse方法的延迟调用版,如果创建默认值耗时较大或者尽在optional为空时才调用,可以考虑该方法。
**/
orElseGet(Supplier<? extends T> other);
/**
* 当对象为空时,抛出自定义的异常。
**/
orElseThrow(Supplier<? extends X> exceptionSupplier);
/**
* 当对象存在时,把对象传入Consumer中。
**/
ifPresent(Consumer<? extends T> c);
使用filter剔除特定的值
/**
* filter方法接收一个谓词,如果Optional对象的值存在,并且它符合谓词的条件,filter方法就返回其值。否则就返回一个空的Optional对象。
**/
Optional<Insurance> optInsurance = ...;
optInsurance.filter(insurance ->
"CambridgeInsurance".equals(insurance.getName()))
.ifPresent(x -> System.out.println("ok"));