1. 概述

Java 11 为最常用的 String 类新增了几个非常实用的 API。这些方法虽然看起来简单,但在日常开发中能显著提升代码可读性和开发效率。本文将逐一介绍这些新特性,并结合示例演示它们的用法。

2. repeat() 方法:字符串重复拼接

顾名思义,repeat(int n) 会将当前字符串重复拼接 n 次并返回结果。

适用场景:快速生成重复内容,比如日志分隔符、测试数据等。

@Test
public void whenRepeatStringTwice_thenGetStringTwice() {
    String output = "La ".repeat(2) + "Land";
    assertEquals("La La Land", output);
}

⚠️ 注意事项:

  • 如果传入参数为 0 或字符串本身为空,则返回空字符串。
  • 参数不能为负数,否则抛出 IllegalArgumentException

3. strip*() 系列方法:更智能的空白字符清理

Java 11 引入了以下三个用于去除空白字符的方法:

方法名 功能说明
strip() 去除首尾所有 Unicode 空白字符
stripLeading() 仅去除开头空白字符
stripTrailing() 仅去除结尾空白字符

示例:

@Test
public void whenStripString_thenReturnStringWithoutWhitespaces() {
    assertEquals("hello", "\n\t  hello   \u2005".strip());
}

3.1. strip() vs trim():谁更懂 Unicode?

虽然功能类似,但两者在处理 Unicode 空白字符时表现不同:

  • strip() 使用 Character.isWhitespace() 判断空白字符,支持完整的 Unicode 规范。
  • trim() 只识别 ASCII 范围内(≤ U+0020)的空白字符。

看个例子就明白了:

@Test
public void whenTrimAdvanceString_thenReturnStringWithWhitespaces() {
    // \u2005 是一个 Unicode 空格字符,trim 不认识它
    assertEquals("hello   \u2005", "\n\t  hello   \u2005".trim());
}

结论:如果你要兼容 Unicode 空白字符,优先使用 strip()

4. isBlank() 方法:判断是否为空或纯空白

这个方法用于判断字符串是否为空或者只包含空白字符(包括 Unicode 空白),返回布尔值。

✅ 实用性很高,尤其在做表单校验或输入清洗时。

@Test
public void whenBlankString_thenReturnTrue() {
    assertTrue("\n\t\u2005  ".isBlank());
}

⚠️ 与 isEmpty() 的区别:

  • isEmpty() 只检查长度是否为 0。
  • isBlank() 还会检查内容是否全是空白字符。

5. lines() 方法:按行拆分字符串为 Stream

该方法可以将多行字符串按行终止符(\n, \r, \r\n)分割成一个 Stream<String>,每行的内容不包含行终止符。

✅ 非常适合处理文本文件、SQL 脚本、日志等多行内容。

@Test
public void whenMultilineString_thenReturnNonEmptyLineCount() {
    String multilineStr = "This is\n \n a multiline\n string.";

    long lineCount = multilineStr.lines()
        .filter(line -> !line.isBlank())
        .count();

    assertEquals(3L, lineCount); // 实际非空行为 3 行
}

💡 小贴士:

  • 相比于 split("\n")lines() 更高效,也更安全。
  • 返回的是惰性求值的 Stream,适合链式操作和大数据量处理。

6. 总结

Java 11 在 String 类上新增的这几个方法虽然小巧,但在实际项目中却非常实用。尤其是 strip()isBlank()lines(),在处理文本内容时能有效减少样板代码。

📦 示例代码可以在 GitHub 仓库 找到。


🎯 一句话总结:

Java 11 给 String 加了点料,虽然不多,但够香!


原始标题:Java 11 String API Additions