Java8中的Optional

版权声明:随意转载,请勿商用。转载请注明出处,谢谢。 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"));

猜你喜欢

转载自blog.csdn.net/xinhongyang/article/details/86649614