Java8在java.util包中添加了一个新的类Optional。
Optional类是一个容器,用于表示可能包含也可能不包含非null值。
Optional类提供了许多方法用于处理可用或不可用,而不是简单的检查空值情况。
java.util.Optional类的声明如下
public final class Optional<T> extends Object
注意:该类是一个最终类,不能被继承和扩展。
Optional类提供了三个静态方法用于创建Optional类的实例,这三个方法的返回值都是Optional。
| 方法 | 说明 |
|---|---|
| empty() | 创建一个空的Optional类的实例 |
| of(T value) | 创建一个包含了指定T类型的value值的Optional实例 |
| ofNullable(T value) | 如果value非null,则创建一个包含了指定T类型的value值的Optional实例,否则创建一个空的Optional实例 |
Optional创建对象的使用:
Dish dish = new Dish("pork", false, 800, Dish.Type.MEAT);
// 声明一个空的Optional
Optional<Dish> dish1 = Optional.empty();
// 依据一个非空值创建Optional,dish是一个null,这段代码会立即抛出一个NullPointerException,而不会等到使用时再报错
Optional<Dish> dish2 = Optional.of(dish);
// 可接受null的Optional
Optional<Dish> dish3 = Optional.ofNullable(dish);
| 方法 | 说明 |
|---|---|
| Optional filter(Predicate predicate) | 如果存在值,并且值与给定谓词匹配,则返回描述值的Optional,否则返回空Optional |
| Optional flatMap(Function mapper) | 如果值存在,则将flatMap应用到该值上并返回应用后的结果,如果值不存在,则返回一个空的Optional |
| T get() | 如果此Optional中存在值,则返回该值,否则抛出NoSuchElementException 异常 |
| void ifPresent(Consumer consumer) | 如果值存在,则使用该值作为参数调用方法consumer。如果值不存在,则什么事情都不做 |
| boolean isPresent() | 如果值存在则返回true ,否则返回false |
| Optional map(Function mapper) | 如果存在值,则将传递的map函数应用于该值,如果结果为非null,则返回描述结果的Optionals |
| T orElse(T other) | 如果值存在则返回值,否则返回other |
| T orElseGet(Supplier other) | 如果值存在则返回值,否则调用other并返回该调用的结果 |
| T orElseThrow(Supplier exceptionSupplier) | 如果值存在,则返回包含的值,否则抛出由开发者提供的异常 |
Optional的使用:
Optional<Dish> dish4 = Optional.of(dish).filter(Dish::isVegetarian);
dish4.ifPresent(System.out::println);
Dish dish5 = Optional.of(dish).get();
System.out.println(dish5);
boolean present = Optional.of(dish).isPresent();
System.out.println(present);
Dish dish6 = null;
dish6 = Optional.ofNullable(dish6).orElse(dish);
System.out.println(dish6);
package com.morris.java8.optional;
import java.util.Optional;
public class OptionalExample {
public static void main(String[] args) {
Insurance insurance = new Insurance();
insurance.setName("morris");
Car car = new Car();
car.setInsurance(Optional.ofNullable(insurance));
Person person = new Person();
person.setCar(Optional.ofNullable(car));
// 使用map从Optional对象中提取和转换值
Optional.of(insurance).map(Insurance::getName).ifPresent(System.out::println);
// 使用flatMap链接Optional对象
String carInsuranceName = getCarInsuranceName(Optional.ofNullable(person));
System.out.println(carInsuranceName);
}
public static String getCarInsuranceName(Optional<Person> person) {
return person.flatMap(Person::getCar)
.flatMap(Car::getInsurance)
.map(Insurance::getName)
.orElse("Unknown");
}
static class Person {
private Optional<Car> car;
public Optional<Car> getCar() { return car; }
public void setCar(Optional<Car> car) {
this.car = car;
}
}
static class Car {
private Optional<Insurance> insurance;
public Optional<Insurance> getInsurance() { return insurance; }
public void setInsurance(Optional<Insurance> insurance) {
this.insurance = insurance;
}
}
static class Insurance {
private String name;
public String getName() { return name; }
public void setName(String name) {
this.name = name;
}
}
}