一、关于
Java 8 在java.util
包中添加了一个新的类Optional
,Optional
类是一个容器,用于表示可能包含也可能不包含非 null 值,可以用来帮助我们避免空指针的问题。
二、java.util.Optional 类
2.1 创建
Optional 类提供了三个静态方法用于创建 Optional 类的实例
方法 | 说明 |
---|---|
empty() | 创建一个空 ( empty ) 的 Optional 类的实例 |
of(T value) | 创建一个包含了指定 T 类型的 value 值的 Optional 实例 |
ofNullable(T value) | 如果 value 非 null ,则创建一个包含了指定 T 类型的 value 值的 Optional 实例,否则创建一个空的 Optional 实例 |
2.2 Optional 类提供的方法
方法 | 说明 |
---|---|
boolean equals(Object obj) | 判断某个其它的对象是否 「 等于 」 此 Optional |
Optional |
如果存在值,并且值与给定谓词匹配,则返回描述值的 Optional,否则返回空 Optional |
Optional flatMap(Function<? super T, Optional> mapper) | 如果值存在,则将 map 应用到该值上并返回应用后的结果,如果值不存在,则返回一个空的 Optional |
T get() | 如果此 Optional 中存在值,则返回该值,否则抛出NoSuchElementException 异常 |
int hashCode() | 如果值存在,则返回当前值的哈希值,如果不存在值,则返回 0 |
void ifPresent(Consumer<? super T> consumer) | 如果值存在,则使用该值作为参数调用方法 consumer 。如果值不存在,则什么事情都不做 |
boolean isPresent() | 如果值存在则返回 true ,否则返回 false |
Optional map(Function<? super T,? extends U> mapper) | 如果存在值,则将传递的 map 函数应用于该值,如果结果为非 null,则返回描述结果的 Optionals |
T orElse(T other) | 如果值存在则返回值,否则返回 other |
T orElseGet(Supplier<? extends T> other) | 如果值存在则返回值,否则调用 other 并返回该调用的结果 |
如果值存在,则返回包含的值,否则抛出由开发者提供的异常 | |
String toString() | 返回此 Optional 的非空字符串表示形式,一般用于调试 |
三、使用
// Optional 构造方式1 - of 传入的值不能为 null
Optional<String> helloOption = Optional.of("hello");
// Optional 构造方式2 - empty 一个空 optional
Optional<String> emptyOptional = Optional.empty();
// Optional 构造方式3 - ofNullable 支持传入 null 值的 optional
Optional<String> nullOptional = Optional.ofNullable(null);
Optional<String> stringOptional = Optional.of("hello");
// 判断是否不为null
System.out.println(stringOptional.isPresent());
// 获取值
// 1、get 直接获取值,为空时抛出NoSuchElementException异常
System.out.println(stringOptional.get());
// 2、orElse 为空时获取到默认值
stringOptional.orElse("default");
// 3、orElseGet 为空时获取到默认值,与orElse相比,Supplier方法只有在Optional对象不含值时才执行调用
stringOptional.orElseGet(() -> "default");
// 4、orElseThrow 为空时抛出自定义异常
stringOptional.orElseThrow(() -> new NullPointerException("值为空"));
// ifPresent 存在值时调用方法,不存在时do nothing
stringOptional.ifPresent(System.out::println);
// filter 过滤值
stringOptional.filter(str -> str.length() > 3).ifPresent(System.out::println);
// map 转换值,返回值与当前值类型相同
stringOptional.map(str -> str + "123");
// flatMap 转换值,返回值可以与传入值不同,且返回值需要手动包装为Optional类型
stringOptional.flatMap(str -> Optional.of(str.length())).ifPresent(System.out::println);