Java 9 Optional 增强:stream()、ifPresentOrElse() 与 or()
三大新方法
1. stream()
public Stream stream()
有值返回单元素流,无值返回空流。配合 flatMap 替代 filter + map 模式。
List> list = Arrays.asList(
Optional.empty(), Optional.of("A"), Optional.empty(), Optional.of("B"));
// Java 8 冗长
List filtered = list.stream()
.flatMap(o -> o.isPresent() ? Stream.of(o.get()) : Stream.empty())
.collect(Collectors.toList());
// Java 9 简洁
List filtered = list.stream()
.flatMap(Optional::stream)
.collect(Collectors.toList());
// 结果: [A, B]
2. ifPresentOrElse(Consumer, Runnable)
public void ifPresentOrElse(Consumer super T> action, Runnable emptyAction)
有值执行 action,无值执行 emptyAction,避免 if-else 分支。
Optional opt = Optional.of(1);
opt.ifPresentOrElse(
x -> System.out.println("Value: " + x),
() -> System.out.println("Not Present.")
); // Value: 1
opt = Optional.empty();
opt.ifPresentOrElse(
x -> System.out.println("Value: " + x),
() -> System.out.println("Not Present.")
); // Not Present.
3. or(Supplier)
public Optional or(Supplier extends Optional extends T>> supplier)
有值返回自身,无值返回 supplier 提供的 Optional,链式 fallback 替代 orElseGet 返回裸值。
Supplier> fallback = () -> Optional.of("Not Present");
Optional.of("Mahesh")
.or(fallback)
.ifPresent(x -> System.out.println("Value: " + x)); // Value: Mahesh
Optional.empty()
.or(fallback)
.ifPresent(x -> System.out.println("Value: " + x)); // Value: Not Present
对比总结
| 方法 | 返回 | 用途 | Java 8 替代 |
|---|---|---|---|
| stream() | Stream | 流管道中扁平化 Optional 序列 | filter+map+flatMap |
| ifPresentOrElse | void | 有值/无值双分支处理 | ifPresent + if (!isPresent) |
| or | Optional | 链式 fallback 保持 Optional 类型 | orElseGet 返回 T |
实战模式:配置加载 fallback 链
Optional config = Optional.ofNullable(System.getenv("APP_CONFIG"))
.or(() -> Optional.ofNullable(System.getProperty("app.config")))
.or(() -> Optional.of("default-config"));
// 依次尝试环境变量、系统属性、默认值,全程 Optional 链式
java
- 深入理解 Java final 关键字:变量、方法与类的不可变性
- Java instanceof 运算符完全指南:用法、继承与接口检查
- 精通 Java 继承:核心概念、类型与实战示例
- 深入理解 Java 静态嵌套类:用法、差异与实战示例
- 精通 Java 匿名内部类:定义、语法与实战示例
- Java 单例模式详解:安全实现与使用指南
- 精通 Java 反射:运行时检查类、方法与字段
- 掌握 Java ObjectOutputStream:序列化、核心方法与实战示例
- 掌握 Java 泛型:构建可复用、类型安全的代码
- 掌握 Java 文件操作:java.io 包下的创建、读取、写入与删除
- Java 9 Stream API 增强:takeWhile、dropWhile、iterate 与 ofNullable
- 掌握 Java 8 Optional:实现空安全代码的实用指南