string.lines() 是 java 11 引入的便捷方法,用于按换行符( 、 、 )分割字符串并返回 stream,自动忽略空行和换行符,支持链式 stream 操作,兼容跨平台换行格式,优于 split(" ")。

String.lines() 是 Java 11 引入的便捷方法,用于将字符串按行分割并返回 Stream<string></string>,特别适合处理多行文本(如配置内容、日志片段、用户输入等),无需手动 split 或包装 ArrayList。
lines() 的基本用法和行为
调用 str.lines() 会以换行符(
、
、
)为分界,把字符串切分成若干非空行(末尾空行会被忽略),每行作为流的一个元素。注意:它不保留空行,也不包含换行符本身。
- 输入
"a b c d"→ 流含 4 个元素:"a"、"b"、"c"、"d" - 输入
"hello world"→ 流含"hello"和"world"(中间空行被跳过) - 输入空字符串
""→ 返回空流(不是 null,可安全 forEach)
配合 Stream API 做常见处理
拿到流后,可链式调用 filter、map、collect 等操作,避免临时集合对象:
- 过滤非空行(虽然 lines 已跳过纯空行,但可进一步过滤含空白字符的行):
str.lines().filter(line -> !line.trim().isEmpty()) - 转成大写并收集为 List:
str.lines().map(String::toUpperCase).collect(Collectors.toList()) - 统计有效行数:
(int) str.lines().count() - 查找包含关键词的行:
str.lines().filter(line -> line.contains("error")).findFirst()
注意与 split(" ") 的区别
lines() 比 split("R")(Java 8+ 支持的 Unicode 行边界)更语义清晰、兼容性更好,且自动处理不同平台换行符;而 split("
") 只识别 LF,对 Windows 的
会出错(如把 "a
b" 分成 "a
" 和 "b")。
- 推荐统一用
lines(),尤其处理跨平台文本时 - 若需保留空行,改用
Pattern.compile("\R").splitAsStream(str)
实际小例子:解析简单配置字符串
比如一段内联配置:
String config = "host=localhost port=8080 # comment enabled=true";提取 key=value 行并构造成 Map:
config.lines().filter(line -> line.contains("=") && !line.startsWith("#")).map(line -> line.split("=", 2)).collect(Collectors.toMap(parts -> parts[0].trim(), parts -> parts[1].trim()));
结果是 {host=localhost, port=8080, enabled=true}。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











