Java8中的Optional

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"));
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值