java 11 的 string.lines() 方法将多行字符串按 、 、 等平台无关换行符分割为 stream,保留空行作为空字符串元素,支持惰性求值与链式操作,不自动 trim,需显式过滤或清理空白。

String.lines() 是 Java 11 引入的便捷方法,用于将多行字符串按行分割并返回 Stream<string></string>,特别适合链式处理、过滤、映射等操作。
lines() 的基本用法
该方法会以平台无关的方式按换行符(
、
、
)切分字符串,自动忽略末尾空行,并去除每行首尾空白(注意:不是自动 trim,而是按原样保留空白,仅按换行符切分)。
- 输入字符串中连续多个换行符会被视为多个空行,
lines()会为每个空行生成一个空字符串元素 - 返回的 Stream 是延迟求值、不可重复使用的,用完即关闭
- 若字符串为
null,调用lines()会抛出NullPointerException
常见处理场景示例
比如处理配置文本或日志片段:
String text = "apple
banana
cherry
date";
text.lines()
.filter(line -> !line.trim().isEmpty()) // 过滤掉空行(含纯空白行)
.map(String::trim) // 去除每行首尾空格
.map(String::toUpperCase)
.forEach(System.out::println);
// 输出:
// APPLE
// BANANA
// CHERRY
// DATE
注意事项与避坑点
容易被忽略的关键细节:
-
lines()不等价于split("\R"):前者更准确识别 Unicode 换行符(如u2028、u2029),后者只支持经典换行序列 - 不要在循环中反复调用
lines()处理同一字符串——Stream 只能消费一次,重复使用会报IllegalStateException - 若需多次遍历,可先收集为
List<string></string>:text.lines().toList()(Java 16+)或.collect(Collectors.toList())
替代方案对比(Java 11 之前)
老版本常用 split("
") 或 Pattern.compile("\R").splitAsStream(),但前者无法跨平台识别
,后者虽功能等价但写法更冗长。用 lines() 更简洁安全。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











