Java 9 Stream API 增强:takeWhile、dropWhile、iterate 与 ofNullable
新增四大方法
1. takeWhile(Predicate)
有序流:取最长前缀,直到谓词首次返回 false;无序流:取任意满足谓词的子集(实现相关)。
Stream.of("a","b","c","","e","f")
.takeWhile(s -> !s.isEmpty())
.forEach(System.out::print); // 输出: abc
2. dropWhile(Predicate)
有序流:丢弃最长前缀(谓词为 true),返回剩余元素;无序流:丢弃任意满足谓词的子集。
Stream.of("a","b","c","","e","f")
.dropWhile(s -> !s.isEmpty())
.forEach(System.out::print); // 输出: ef
Stream.of("a","b","c","","e","","f")
.dropWhile(s -> !s.isEmpty())
.forEach(System.out::print); // 输出: ef
3. iterate(seed, hasNext, next)
有限迭代流:在 hasNext 返回 false 时停止,替代无限 iterate(seed, next) 配合 limit() 的模式。
IntStream.iterate(3, x -> x < 10, x -> x + 3)
.forEach(System.out::println); // 3, 6, 9
4. ofNullable(T)
空安全流源:非 null 返回单元素流,null 返回空流,避免 NullPointerException 与显式判空。
Stream.ofNullable(100).count(); // 1
Stream.ofNullable(null).count(); // 0
对比总结
| 方法 | 用途 | 典型场景 |
|---|---|---|
| takeWhile | 前缀截取 | 读取配置直到空行、处理有序日志直到标记行 |
| dropWhile | 前缀跳过 | 跳过注释行、跳过 CSV 头部 |
| iterate(3参数) | 有条件有限迭代 | 生成等差数列、斐波那契数列、分页游标 |
| ofNullable | 空安全单元素流 | 可选配置项转流、避免三元判空 |
组合示例:处理带注释的配置文件
List lines = Files.readAllLines(Paths.get("config.txt"));
List config = lines.stream()
.dropWhile(line -> line.startsWith("#")) // 跳过头部注释
.takeWhile(line -> !line.isEmpty()) // 取正文直到空行
.map(String::trim)
.filter(line -> !line.isEmpty())
.collect(Collectors.toList());
java
- 精通 Java 运算符:类型、语法与实战示例
- Java 注释:类型、用法与最佳实践
- 精通 Java 增强 for 循环:语法、示例与最佳实践
- 精通 Java 字符串:创建、方法与最佳实践
- 精通 Java 接口:概念、实现与最佳实践
- 精通 Java 匿名内部类:定义、语法与实战示例
- 精通 Java Try-With-Resources:自动资源管理详解
- Java 注解详解:类型、放置位置与实战示例
- Java 断言实战指南:尽早发现 Bug 与保障代码可靠性
- Java 9 (JDK 9) 核心特性与优势全览
- Java 9 进程 API 改进:ProcessHandle 与异步控制
- Java 9 Optional 增强:stream()、ifPresentOrElse() 与 or()