Optional
Optional<T>类(java.util.Optional)是一个容器类,代表一个值存在或不存在;
- isPresent()将在Optional包含值的时候返回true, 否则返回false;
- ifPresent(Consumer<T> block)会在值存在的时候执行给定的代码块;
- get()会在值存在时返回值,否则抛出一个NoSuchElement异常;
- orElse(T other)会在值存在时返回值,否则返回一个默认值;
常用API
- empty():返回一个空的Optional实例
- filter():如果值存在并且满足提供的谓词,就返回包含该值的Optional对象;否则返回一个空的Optional对象
- flatMap():如果值存在,就对该值执行提供的mapping函数调用,返回一个Optional类型的值,否则就返回一个空的Optional对象
- isPresent():如果值存在就返回true,否则返回false
- map():如果值存在,就对该值执行提供的mapping函数调用
- get()是这些方法中最简单但又最不安全的方法。如果变量存在,它直接返回封装的变量值,否则就抛出一个NoSuchElementException异常。所以,除非你非常确定Optional变量一定包含值,否则使用这个方法是个相当糟糕的主意。此外,这种方式即便相对于嵌套式的null检查,也并未体现出多大的改进;
- orElse(Tother)是我们在代码清单10-5中使用的方法,正如之前提到的,它允许你在Optional对象不包含值时提供一个默认值;
- orElseGet(Supplier<?extendsT>other)是orElse方法的延迟调用版,Supplier方法只有在Optional对象不含值时才执行调用。
- orElseThrow(Supplier<?extendsX>exceptionSupplier)和get方法非常类似,它们遭遇Optional对象为空时都会抛出一个异常,但是使用orElseThrow你可以定制希望抛出的异常类型
- ifPresent(Consumer<?superT>)让你能在变量值存在时执行一个作为参数传入的方法,否则就不进行任何操作
Optional<Car> optCar = Optional.empty();
Optional<Car> optCar = Optional.of(car); // 如果car是一个null,这段代码会立即抛出一个NullPointerException
Optional<Car> optCar = Optional.ofNullable(car);