新特性06| Optional类

简介

Java Optional Class : Every Java Programmer is familiar with NullPointerException. It can crash your code. And it is very hard to avoid it without using too many null checks.
Java 8 has introduced a new class Optional in java.util package. It can help in writing a neat code without using too many null checks. By using Optional, we can specify alternate values to return or alternate code to run. This makes the code more readable because the facts which were hidden are now visible to the developer.

(译文)Java Optional类:Java程序员对空指针异常都再熟悉不过了,该异常会导致代码崩溃。在不进行大量的空指针检查下,要避免空指针异常是相当难的。
Java8在java.util.package包下引入了一个新类Optional,该类有助于撰写没有太多空指针检查的整洁代码。使用Optional类可以指定备用值来返回或替代要运行的代码。这样使得代码的可读性更强,因为过去隐藏的东西现在对开发人员可见了。

说明

  1. Optional类是一个可以为null的容器对象,如果值存在isPresent()返回true,get()方法返回该对象;
  2. Optional类是个保存T类型的容器,也可以保存null;
  3. Optional提供了很多方法进行空值检测,这样省去了人为空值检测过程,能很好地解决空指针异常问题。

类声明

public final class Optional<T> extends Object

Optional实例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
import java.util.Optional;

public class Java8Tester {
private Integer sum(Optional<Integer> a, Optional<Integer> b) {
// Optional.orElse - 如果值存在,返回它,否则返回设定值
Integer value1 = a.orElse(-6);
Integer value2 = 0;

if (b.isPresent()) {
//Optional.get - 获取值,值需要存;值不存在返回NoSuchElementException异常
value2 = b.get();
}

// Optional.isPresent - 判断值是否存在
System.out.println("第一个参数值存在: " + a.isPresent() + "此时值为: " + value1);
System.out.println("第二个参数值存在: " + b.isPresent() + "此时值为: " + value2);


return value1 + value2;
}

public static void main(String[] args) {
Java8Tester java8Tester = new Java8Tester();
Integer value1 = null;
Integer value2 = 10;

// Optional.ofNullable - 允许传递为 null 参数
Optional<Integer> a = Optional.ofNullable(value1);

// Optional.of - 如果传递的参数是 null,抛出异常 NullPointerException,否则返回传入值
Optional<Integer> b = Optional.of(value2);

System.out.println("二值相加等于: " + java8Tester.sum(a, b));
}
}

输出:

1
2
3
第一个参数值存在: false此时值为: -6
第二个参数值存在: true此时值为: 10
二值相加等于: 4

更多详细内容参见官方文档

码哥 wechat
欢迎关注个人订阅号:「码上行动GO」