Java 11 对 String
类进行了多项增强,引入以下新方法,覆盖空白处理、多行文本分割和字符串重复等场景。
以下是所有新增方法的详细说明及实战示例:
1. isBlank()
:检测空白字符串
作用:
判断字符串是否为空或仅包含空白字符(支持 Unicode 空白,如全角空格 \u3000
)。
示例:
String empty = "";
String spaces = " ";
String unicodeSpace = "\u2003"; // Unicode 空白字符(EM SPACE)
System.out.println(empty.isBlank()); // true
System.out.println(spaces.isBlank()); // true
System.out.println(unicodeSpace.isBlank()); // true
对比 isEmpty()
:
System.out.println(empty.isEmpty()); // true
System.out.println(spaces.isEmpty()); // false(长度不为0)
System.out.println(unicodeSpace.isEmpty()); // false
2. lines()
:按行分割为流
作用:
将字符串按换行符 \n
或 \r\n
分割为 Stream<String>
,适合处理多行文本。
示例:
String text = "Line 1\nLine 2\r\nLine 3";
List<String> lines = text.lines()
.map(line -> "Processed: " + line)
.collect(Collectors.toList());
System.out.println(lines);
// 输出:[Processed: Line 1, Processed: Line 2, Processed: Line 3]
性能特点:
- 惰性处理:逐行生成流,避免一次性加载大文本到内存。
- 内存高效:适合处理大型文件(如日志分析)。
3. strip()
:去除首尾空白
作用:
去除字符串首尾的空白字符(包括 Unicode 空白,如 \u2003
)。
示例:
String input = " Hello Java 11! ";
String stripped = input.strip();
System.out.println(stripped); // "Hello Java 11!"
对比 trim()
:
String unicodeInput = "\u2003Trim Test\u2003";
System.out.println(unicodeInput.trim().length()); // 10(未去除 Unicode 空白)
System.out.println(unicodeInput.strip().length()); // 8(正确去除)
4. stripLeading()
和 stripTrailing()
:定向去除空白
作用:
stripLeading()
:仅去除字符串开头的空白。stripTrailing()
:仅去除字符串结尾的空白。
示例:
String text = " Hello ";
System.out.println(text.stripLeading()); // "Hello "
System.out.println(text.stripTrailing()); // " Hello"
5. repeat(int n)
:重复字符串
作用:
将字符串重复 n
次生成新字符串。
示例:
String base = "Java";
String repeated = base.repeat(3);
System.out.println(repeated); // "JavaJavaJava"
性能优化:
- 时间复杂度为 O(n),底层使用
Arrays.fill
高效实现。 - 适用于生成固定模式字符串(如分隔符、占位符)。
四、实战场景
场景 1:用户输入验证
public class InputValidator {
public static void validate(String input) {
if (input == null || input.isBlank()) {
throw new IllegalArgumentException("输入不能为空");
}
// 进一步处理...
}
}
场景 2:CSV 数据处理
String csvData = "Name, Age, City\nAlice, 30, New York\nBob, London";
List<Person> persons = csvData.lines()
.skip(1) // 跳过表头
.map(line -> {
String[] fields = line.split(", ");
return new Person(fields[0], Integer.parseInt(fields[1]), fields[2]);
})
.collect(Collectors.toList());
场景 3:生成动态 SQL 条件
public class QueryBuilder {
public static String buildWhereClause(List<String> conditions) {
if (conditions.isEmpty()) {
return "";
}
return "WHERE " + String.join(" AND ", conditions.stream()
.map(cond -> "(" + cond + ")")
.toArray(String[]::new));
}
}
五、总结对比
方法 | 功能 | Unicode 支持 | 替代旧方法 |
---|---|---|---|
isBlank() | 检测空或全空白字符串 | 是 | 手动正则检查 |
strip() | 去除首尾空白(含 Unicode) | 是 | trim() |
lines() | 分割多行文本为流 | 是 | split("\\r?\\n") |
repeat(n) | 重复字符串 | 不适用 | 手动循环拼接 |
最佳实践:
- 优先使用新方法:替代繁琐的正则或手动处理。
- 注意性能场景:大文本处理用
lines()
避免内存溢出。 - 处理国际化内容:使用
strip()
确保兼容多语言空白字符。
通过合理利用这些增强方法,代码可读性、健壮性和性能均能得到显著提升。