本文目录导读:

Java的格式化API在Java 21中有了重大更新,以下是主要的新增内容:
StringTemplate (Java 21 预览特性)
这是最重大的新增,提供了一种全新的字符串格式化方式:
// 使用 STR 模板处理器
String name = "Alice";
int age = 30;
String message = STR."\{name} is \{age} years old";
// 输出: "Alice is 30 years old"
// 支持表达式
int x = 10, y = 20;
String result = STR."\{x} + \{y} = \{x + y}";
// 输出: "10 + 20 = 30"
// 支持方法调用
String upper = STR."Hello \{name.toUpperCase()}";
// 输出: "Hello ALICE"
自定义模板处理器
可以创建自己的模板处理器:
// 创建 JSON 模板处理器
StringTemplate.Processor<JSONException, RuntimeException> JSON =
StringTemplate.Processor.of(
st -> new JSONObject(st.interpolate())
);
// 使用自定义处理器
String name = "Bob";
JSONObject json = JSON."""
{
"name": "\{name}",
"age": 25
}
""";
FMT 模板处理器
结合了 String.format() 的功能:
double price = 19.99;
int quantity = 3;
String invoice = FMT."""
Item: %-10s\{item}
Price: $%.2f\{price}
Quantity: %d\{quantity}
Total: $%.2f\{price * quantity}
""";
RAW 模板处理器
获取原始模板而不进行插值:
var st = RAW."Hello \{name}";
// 返回 StringTemplate 对象,而不是插值后的字符串
改进的 DateTimeFormatter
Java 21 增加了新的日期时间格式化选项:
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("B")
.withLocale(Locale.ENGLISH);
// B 表示"day period" (上午/下午/晚上等)
NumberFormat 增强
// 紧凑数字格式
NumberFormat fmt = NumberFormat.getCompactNumberInstance(
Locale.US, NumberFormat.Style.SHORT);
fmt.format(1200); // "1.2K"
fmt.format(1000000); // "1M"
注意:
StringTemplate在 Java 21 中是预览特性,需要使用--enable-preview启用- 后续版本(Java 22+)可能会有所调整或正式发布
这些新特性极大地提升了 Java 字符串处理的灵活性和可读性。