欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

java8 Optional类详解

程序员文章站 2022-03-04 10:57:20
...

Optional

java8中引入一个新的类java.util.Optional<T>。这是一个包装引用类型的一个类。java8之前调用方法的时候当我们不知道返回值是否可能为null的时候,我们要对每个结果使用前进行null检查,如果不慎对null引用进行调用就会抛出NullPointerException异常。现在我们可以通过Optional.empty()返回一个空的Optional对象,它返回一个特定的单一实例。这样对Optional.empty()的操作也防止NullPointerException异常产生。

使用Optional一个重要原因就是,例如当我们声明一个Optional<Car>类型的时候表示这个Car变量是可以缺失的。当我们声明一个Car的时候表示这个Car是不能缺失的。这样就对数据的可能行清晰的理解,丰富的数据模型的语义。

Optional对象创建

1.声明一个空的Optional

Optional<Car> optCar = Optional.empty();

2依据一个非空值创建Optional

Optional<Car> optCar = Optional.of(car);

如果car是一个null会立即抛出一个NullPointerException,而不是等你试图访问car的属性是才返回一个错误。
3可接受null的Optional

Optional<Car> optCar = Optional.ofNullable(car);

Optional对象获取

  • 使用map从Optional对象中提取和转换值。
  • 使用flatMap链接Optional对象

例:

public class OptionalTest {
	public static void main(String[] args) {
		Optional<Persion> p = getP();
		Optional<String> panme = p.map(pe -> pe.getName());
		Optional<String> carname = p.flatMap(pp -> pp.getCar()).flatMap(car -> car.getName());
	}
	public static Optional<Persion> getP() {
		return Optional.ofNullable(null);
	}
}

class Persion {
	private Optional<Car> car;
	private String name;

	public Optional<Car> getCar() {
		return car;
	}

	public void setCar(Optional<Car> car) {
		this.car = car;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

}

class Car {
	private Optional<String> name;

	public Optional<String> getName() {
		return name;
	}

	public void setName(Optional<String> name) {
		this.name = name;
	}
}

读取Optional中实例变量的值

Optional类提供了多种方法

  • get()是方法中简单但又是最不安全的方法。如果变量存在则返回封装的变量值,否则抛出NoSuchElementException。
  • OrElse(T other)允许在Optional对象在不含值的时候提供一个默认值。
  • isPresent()可以判定Optional封装的变量是否存在。

转载于:https://my.oschina.net/hongliangsun/blog/1546440