1 前言

Optional 是 Java 8 的新特性,专治空指针异常(NullPointerException, 简称 NPE)问题,它是一个容器类,里面只存储一个元素(这点不同于 Conllection)。

为方便用户通过 Lambda 表达式调用 Optional 的方法,部分方法(如:filter、ifPresent、map、orElseGet)需传入函数式接口(如:Predicate、Consumer、Function、Supplier)参数。关于 Lambda 表达式的介绍,详见→Lambda 表达式总结

2 主要属性及构造方法

(1)类定义

Optional 类位于 java.util 包中,类定义如下:

//T 为元素数据类型
public final class Optional<T>

(2)主要属性

//空容器
private static final Optional<?> EMPTY = new Optional<>();

//value 存储容器内唯一元素
private final T value;

(3)构造方法

//无参构造方法:this.value = null
private Optional()

//有参构造方法(value不允许为空):this.value = Objects.requireNonNull(value)
private Optional(T value)

3 常用方法

(1)创建容器(empty、of、ofNullable)

//创建空容器:return (Optional<T>) EMPTY
public static<T> Optional<T> empty()

//创建容器(value不允许为空):return new Optional<>(value)
public static <T> Optional<T> of(T value)

//创建容器(value允许为空):return value == null ? empty() : of(value)
public static <T> Optional<T> ofNullable(T value)

(2)容器判空(isPresent)

//判断容器是否为空:return value != null
public boolean isPresent()

//判断容器是否为空,若不为空,消费元素
public void ifPresent(Consumer<? super T> consumer) {
	if (value != null)
		consumer.accept(value);
}

应用:

Optional<User> op = Optional.of(new User("张三", 20));
op.ifPresent(user -> System.out.println(user));
//op.ifPresent(System.out::println);

(3)获取元素(get、orElse、orElseGet)

//获取容器中唯一元素:return value
public T get()

//获取容器唯一元素,若为空,返回指定值:return value != null ? value : other
public T orElse(T other)

//获取容器唯一元素,若为空,返回供应者(Supplier)提供的元素
public T orElseGet(Supplier<? extends T> other) {
	return value != null ? value : other.get();
}

应用:

Optional<User> op = Optional.ofNullable(null);
User user = op.orElseGet(() -> new User("张三", 20));

(4)筛选元素(filter)

//过滤不符合断言(Predicate)的元素
public Optional<T> filter(Predicate<? super T> predicate) {
	Objects.requireNonNull(predicate);
	if (!isPresent())
		return this;
	else
		return predicate.test(value) ? this : empty();
}

应用:

Optional<User> op = Optional.of(new User("张三", 20));
Optional<User> op2 = op.filter(user -> user.age > 18);

(5)映射元素(map)

//将 T 类型元素映射为 U 类型元素
public<U> Optional<U> map(Function<? super T, ? extends U> mapper) {
	Objects.requireNonNull(mapper);
	if (!isPresent())
		return empty();
	else {
		return Optional.ofNullable(mapper.apply(value));
	}
}

应用:

Optional<String> op = Optional.of(new String("12345"));
Optional<Integer> op2 = op.map(str -> {
	try {
		return Integer.parseInt(str);
	} catch (Exception e) {
		return -1;
	}
});

​ 声明:本文转自Optional 详解