Java 15 中如何使用 String.formatted() 使字符串模板填充更简洁高效?
- 内容介绍
- 文章标签
- 相关推荐
本文共计663个文字,预计阅读时间需要3分钟。
`String.formatted() 是 Java 15 引入的便捷方法,用于替代传统的 String.format()。该方法语法更简洁、可读性更强,且在编译期不做检查(运行时行为一致)。它直接作用于字符串字面量或变量,调用后返回填充后的结果字符串。
基本用法:替代 String.format() 的链式调用
以前写:
String result = String.format("Hello %s, you have %d new messages", name, count);现在可写成:
String result = "Hello %s, you have %d new messages".formatted(name, count);关键点:
立即学习“Java免费学习笔记(深入)”;
- 调用者必须是字符串对象(不能是 null),否则抛
NullPointerException - 格式说明符(如
%s、%d、%.2f)与String.format()完全兼容 - 参数个数和类型需匹配,不匹配会在运行时抛
IllegalFormatConversionException或MissingFormatArgumentException
配合常量字符串提升可维护性
把模板提取为 private static final 字符串,再调用 formatted(),既清晰又利于复用:
...
String msg = WELCOME_MSG.formatted(username, balance);
相比拼接或硬编码格式,这种方式保留了类型安全提示(IDE 可校验占位符数量),也避免了重复书写模板逻辑。
注意 null 和空字符串场景
formatted() 不处理 null 参数——传入 null 时,%s 会正常转为字符串 "null",但 %d、%f 等会直接抛异常。建议提前校验:
- 对可能为
null的引用类型,可用Objects.toString(obj, "N/A")预处理 - 数值类参数建议用包装类型判空,或使用 Optional 提供默认值
- 空字符串(
"")本身合法,无需特殊处理
不适用于动态模板或复杂逻辑
如果模板本身来自配置文件、用户输入或数据库,不建议直接调用 formatted(),因为:
- 无法在编译期发现占位符与参数不匹配的问题
- 存在格式注入风险(如恶意传入
%n%01000000d可能引发性能问题) - 此时仍推荐用
MessageFormat或模板引擎(如 Thymeleaf、StringTemplate)
本文共计663个文字,预计阅读时间需要3分钟。
`String.formatted() 是 Java 15 引入的便捷方法,用于替代传统的 String.format()。该方法语法更简洁、可读性更强,且在编译期不做检查(运行时行为一致)。它直接作用于字符串字面量或变量,调用后返回填充后的结果字符串。
基本用法:替代 String.format() 的链式调用
以前写:
String result = String.format("Hello %s, you have %d new messages", name, count);现在可写成:
String result = "Hello %s, you have %d new messages".formatted(name, count);关键点:
立即学习“Java免费学习笔记(深入)”;
- 调用者必须是字符串对象(不能是 null),否则抛
NullPointerException - 格式说明符(如
%s、%d、%.2f)与String.format()完全兼容 - 参数个数和类型需匹配,不匹配会在运行时抛
IllegalFormatConversionException或MissingFormatArgumentException
配合常量字符串提升可维护性
把模板提取为 private static final 字符串,再调用 formatted(),既清晰又利于复用:
...
String msg = WELCOME_MSG.formatted(username, balance);
相比拼接或硬编码格式,这种方式保留了类型安全提示(IDE 可校验占位符数量),也避免了重复书写模板逻辑。
注意 null 和空字符串场景
formatted() 不处理 null 参数——传入 null 时,%s 会正常转为字符串 "null",但 %d、%f 等会直接抛异常。建议提前校验:
- 对可能为
null的引用类型,可用Objects.toString(obj, "N/A")预处理 - 数值类参数建议用包装类型判空,或使用 Optional 提供默认值
- 空字符串(
"")本身合法,无需特殊处理
不适用于动态模板或复杂逻辑
如果模板本身来自配置文件、用户输入或数据库,不建议直接调用 formatted(),因为:
- 无法在编译期发现占位符与参数不匹配的问题
- 存在格式注入风险(如恶意传入
%n%01000000d可能引发性能问题) - 此时仍推荐用
MessageFormat或模板引擎(如 Thymeleaf、StringTemplate)

