掌握 Java 8 Optional:实现空安全代码的实用指南
Optional 是一个容器对象,用于存放非空对象。它通过“值存在”或“值不存在”来表示 null,避免了直接的空值检查。该类提供了多种实用方法,便于以函数式方式处理可能缺失的值。Optional 引入于 Java 8,类似于 Guava 库中的 Optional。
类声明
以下是 java.util.Optional<T> 类的声明:
public final class Optional<T> extends Object
主要方法
| 序号 | 方法与说明 |
|---|---|
| 1 | static <T> Optional<T> empty() 返回一个空的 Optional 实例。 |
| 2 | boolean equals(Object obj) 判断另一个对象是否与此 Optional 相等。 |
| 3 | Optional<T> filter(Predicate<? super T> predicate) 若值存在且满足给定断言,则返回描述该值的 Optional,否则返回空 Optional。 |
| 4 | <U> Optional<U> flatMap(Function<? super T, Optional<U>> mapper) 若值存在,应用返回 Optional 的映射函数并返回结果,否则返回空 Optional。 |
| 5 | T get() 若值存在则返回该值,否则抛出 NoSuchElementException。 |
| 6 | int hashCode() 返回值的哈希码,若值不存在则返回 0。 |
| 7 | void ifPresent(Consumer<? super T> consumer) 若值存在,使用该值调用给定的消费者,否则不执行任何操作。 |
| 8 | boolean isPresent() 若值存在返回 true,否则返回 false。 |
| 9 | <U> Optional<U> map(Function<? super T, ? extends U> mapper) 若值存在,应用映射函数,若结果非空则返回描述结果的 Optional。 |
| 10 | static <T> Optional<T> of(T value) 返回包含指定非空值的 Optional,若传入 null 则抛出 NullPointerException。 |
| 11 | static <T> Optional<T> ofNullable(T value) 若值非空返回描述该值的 Optional,否则返回空 Optional。 |
| 12 | T orElse(T other) 若值存在返回该值,否则返回指定的默认值。 |
| 13 | T orElseGet(Supplier<? extends T> other) 若值存在返回该值,否则调用供给函数获取并返回结果。 |
| 14 | <X extends Throwable> T orElseThrow(Supplier<? extends X> exceptionSupplier) 若值存在返回该值,否则抛出由供给函数创建的异常。 |
| 15 | String toString() 返回适合调试的非空字符串表示。 |
该类继承自 java.lang.Object 的所有方法。
示例代码
创建以下 Java 程序(例如保存为 Java8Tester.java):
import java.util.Optional;
public class Java8Tester {
public static void main(String args[]) {
Java8Tester tester = new Java8Tester();
Integer value1 = null;
Integer value2 = 10;
// ofNullable 允许传入 null
Optional<Integer> a = Optional.ofNullable(value1);
// of 要求非空,否则抛出 NPE
Optional<Integer> b = Optional.of(value2);
System.out.println(tester.sum(a, b));
}
public Integer sum(Optional<Integer> a, Optional<Integer> b) {
System.out.println("第一个参数是否存在: " + a.isPresent());
System.out.println("第二个参数是否存在: " + b.isPresent());
// orElse 提供默认值
Integer val1 = a.orElse(0);
// get 直接获取值,值必须存在
Integer val2 = b.get();
return val1 + val2;
}
}
验证结果
编译并运行:
javac Java8Tester.java java Java8Tester
输出:
第一个参数是否存在: false 第二个参数是否存在: true 10
java
- 深入理解 Java final 关键字:变量、方法与类的不可变性
- Java instanceof 运算符完全指南:用法、继承与接口检查
- 精通 Java 继承:核心概念、类型与实战示例
- 深入理解 Java 静态嵌套类:用法、差异与实战示例
- 精通 Java 匿名内部类:定义、语法与实战示例
- Java 单例模式详解:安全实现与使用指南
- 精通 Java 反射:运行时检查类、方法与字段
- 精通 Java ArrayList:操作、方法与最佳实践
- 掌握 Java ObjectOutputStream:序列化、核心方法与实战示例
- 掌握 Java 泛型:构建可复用、类型安全的代码
- 掌握 Java 文件操作:java.io 包下的创建、读取、写入与删除
- Java 9 Optional 增强:stream()、ifPresentOrElse() 与 or()