引言

Java Development Kit 11 作为长期支持版本,在 java.lang.String 类中引入了一系列旨在提升开发效率与代码健壮性的新方法。这些新增 API 针对日常开发中的常见痛点提供了标准化、语义清晰的解决方案。本文将对这些新增方法进行系统性的梳理与解读,并通过典型示例展示其相较于传统写法的优势。

一、空白字符判定:isBlank()

方法签名

1
public boolean isBlank()

功能描述

isBlank() 方法用于判断当前字符串是否为空或仅包含空白字符。其判定的空白字符范围遵循 Character.isWhitespace(int) 的定义,涵盖空格、制表符、换行符、全角空格等各类 Unicode 空白字符。

传统写法对比

在 JDK 8 及更早版本中,要准确判断字符串是否仅由空白构成,通常需要结合 trim()isEmpty(),且需预先进行空引用检查:

1
2
3
4
// JDK 8 传统写法
if (str == null || str.trim().isEmpty()) {
// 处理空或空白逻辑
}

此写法存在两点不足:

  1. 易因疏忽遗漏 trim() 调用,导致仅包含空格的数据被当作有效输入。
  2. trim() 仅能移除 ASCII 空格(码点 ≤ U+0020),对 Unicode 空白字符无效。

示例演示

1
2
3
4
5
"".isBlank();          // 返回 true
" ".isBlank(); // 返回 true(包含 ASCII 空格)
"\n\t".isBlank(); // 返回 true(包含转义字符)
"\u2000".isBlank(); // 返回 true(Unicode 空白字符)
"Hello".isBlank(); // 返回 false

适用场景

适用于表单输入校验、配置文件值解析、日志过滤等需排除无效空白内容的场景。该方法可显著减少样板代码并提升语义清晰度。

二、多行文本流式处理:lines()

方法签名

1
public Stream<String> lines()

功能描述

lines() 方法以行终止符作为分隔依据,将当前字符串转换为一个 Stream<String>,流中的每个元素对应原字符串中的一行。该方法能够自动识别并处理多种行终止符,包括 \n(换行)、\r(回车)以及 \r\n(回车换行组合)。

传统写法对比

在旧版本中,处理多行文本通常依赖 split("\n")split("\\R"),手动管理换行符差异较为繁琐,且过滤空白行需额外编写循环逻辑。

示例演示

1
2
3
4
5
String multilineText = "First Line\nSecond Line\r\nThird Line\n\n  \nFourth Line";

multilineText.lines()
.filter(line -> !line.isBlank()) // 结合 isBlank() 过滤空行
.forEach(System.out::println);

输出结果:

1
2
3
4
First Line
Second Line
Third Line
Fourth Line

适用场景

  • 日志文件解析与逐行分析。
  • HTTP 请求体中多行文本数据的提取与处理。
  • 配合 Stream API 进行统计、转换或过滤操作。

三、Unicode 空白移除:strip()stripLeading()stripTrailing()

方法签名

1
2
3
public String strip()
public String stripLeading()
public String stripTrailing()

功能描述

这三个方法用于移除字符串首部、尾部或两端的空白字符,其行为基于 Character.isWhitespace(int) 定义,支持完整的 Unicode 空白字符集。这与仅处理 ASCII 空白的 trim() 方法有本质区别。

**trim()** 的关键差异

特性 trim() strip()
空白判定标准 码点 ≤ U+0020 的字符 Character.isWhitespace() 定义的 Unicode 空白
对全角空格 (U+3000) 无法移除 可正确移除
返回结果 移除前后 ASCII 空白后的新字符串 移除前后 Unicode 空白后的新字符串

示例演示

1
2
3
4
5
6
String unicodeSpace = "\u2000\u3000Hello\u2000\u3000";

System.out.println(unicodeSpace.trim()); // 输出:  Hello  (全角空格未被移除)
System.out.println(unicodeSpace.strip()); // 输出:Hello
System.out.println(unicodeSpace.stripLeading()); // 输出:Hello\u2000\u3000
System.out.println(unicodeSpace.stripTrailing());// 输出:\u2000\u3000Hello

适用场景

当数据来源涉及国际化字符集、富文本编辑器或外部系统导入时,推荐优先使用 strip() 系列方法以避免因 Unicode 空白字符导致的业务逻辑异常。

四、字符串重复拼接:repeat()

方法签名

1
public String repeat(int count)

功能描述

返回一个由当前字符串重复 count 次拼接而成的新字符串。若 count 为零,则返回空字符串。若 count 为负数,则抛出 IllegalArgumentException

传统写法对比

在早期版本中实现字符串重复拼接需借助循环或 StringBuilder

1
2
3
4
5
6
// JDK 8 传统写法
StringBuilder sb = new StringBuilder();
for (int i = 0; i < n; i++) {
sb.append("-");
}
String separator = sb.toString();

示例演示

1
2
3
4
5
6
7
8
// 生成分隔线
String divider = "-".repeat(40); // 结果:"----------------------------------------"

// 生成缩进空格
String indent = " ".repeat(4); // 结果:" "

// 生成测试数据
String pattern = "AB".repeat(3); // 结果:"ABABAB"

注意事项

  • 传入负数将引发 IllegalArgumentException,调用前需确保 count >= 0
  • 重复超大次数(如接近 Integer.MAX_VALUE)可能导致内存溢出,应在业务允许范围内使用。

五、方法速查表

方法 功能描述 示例调用 返回结果
isBlank() 判断是否为空或仅含空白字符 " ".isBlank() true
lines() 将多行文本按行分割为 Stream "a\nb".lines() Stream.of("a", "b")
strip() 移除首尾 Unicode 空白 " hi ".strip() "hi"
stripLeading() 仅移除首部 Unicode 空白 " hi".stripLeading() "hi"
stripTrailing() 仅移除尾部 Unicode 空白 "hi ".stripTrailing() "hi"
repeat(int n) 将当前字符串重复 n 次拼接 "Ha".repeat(2) "HaHa"

六、结语

JDK 11 为 String 类引入的上述方法虽非颠覆性语言特性,却切实解决了长期困扰开发者的细微痛点。isBlank() 让空白检查回归直觉;lines() 与 Stream 的无缝集成简化了文本处理流程;strip() 系列弥补了 trim() 的 Unicode 盲区;repeat() 则使重复拼接操作更加优雅。

对于仍运行于 JDK 8 的项目,若升级成本可控,建议考虑迁移至 JDK 11 或更高版本以享受这些提升生产力与代码质量的新特性。在日常开发与代码审查中,有意识地采用这些标准 API 替代传统写法,有助于构建更加健壮、可读性更强的 Java 应用程序。