浅析Java 8新功能Optional

Posted MaxStack

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了浅析Java 8新功能Optional相关的知识,希望对你有一定的参考价值。

初识

 A container object which may or may not contain a non-null value.

笔者理解,Optional是一个容器类。将Object放到Optional中,从而可以使用容器的一些特性,比如链式编程(Stream)等。

具体应用起来,可以分为两步:

  1. 放入容器
  2. 使用容器

放入容器

有两个方法可以使用,第一个of,不检查传入value是否为null,可能会报NPE。
第二个ofNullable会检查,如果value为null,就返回一个empty的Optional,不会NPE。

static <T> Optional<T> of(T value)
static <T> Optional<T> ofNullable(T value)

容器方法分析

mapfilter功能差不多,对目标Object做某种操作(Function),或者做某种比较(Pridicate),最后返回符合要求的Optional值,不符合的话就是Empty,不会NPE。

<U> Optional<U>	map(Function<? super T,? extends U> mapper)
// If a value is present, apply the provided mapping function to it, and if the result is non-null, return an Optional describing the result. Otherwise return an empty Optional.

Optional<T>	filter(Predicate<? super T> predicate)
// If a value is present, and the value matches the given predicate, return an Optional describing the value, otherwise return an empty Optional.

ifPresent也是保证不会NPE的,如果value有值,就做某操作,否则什么都不做。

void ifPresent(Consumer<? super T> consumer)
// If a value is present, invoke the specified consumer with the value, otherwise do nothing.

使用容器

不写那么多if null的代码,而是用Optional的特性保证不会NPE。

示例1

// OLD
if (student != null) {
	doSomething(student);
}

// NEW
Optional.ofNullable(student).ifPresent(s -> doSomething(s.getName()));

示例2

// OLD
if (student != null) {
	if (student.getName() != null) {
		doSomething(student.getName().trim());
	}
}

// NEW
Optional.ofNullable(student).ifPresent(s -> Optional.ofNullable(s.getName()).ifPresent(name -> doSomething(name.trim())));
Optional.ofNullable(student).map(s -> s.getName()).ifPresent(name -> doSomething(name.trim()));
Optional.ofNullable(student).map(Student::getName).ifPresent(name -> doSomething(name.trim()));

总结

Optional和Stream,感觉一是要慢慢去熟悉这种代码风格,二是适合于逻辑不那么复杂的场景。

参考

以上是关于浅析Java 8新功能Optional的主要内容,如果未能解决你的问题,请参考以下文章

Java 8——Optional

Java 8 用 Optional 替换两个空检查

如何更好地使用Java 8的Optional

Java基础之Optional类(JDK1.8新特性)

Java 8 Optional:优雅地避免 NPE

Java 8 API 设计经验浅析