文本块与 String.format
使用文本块编写多行字符串,并通过 String.format 格式模式格式化数据
文本块与 String.format 是 CoddyKit 上的免费 Java Academy 课时。 这是第 3 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Java Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Java Academy 课程共包含 4 节课。
文本块与 String.format
文本块(Java 15+)允许您在无需转义的情况下编写多行字符串字面量。将它们与 String.format 和 formatted() 结合使用,可以让复杂的字符串输出更加简洁易读。
什么是文本块
文本块是使用三个双引号 """ 括起来的字符串字面量。它会自动保留换行和缩进,从而无需为多行内容编写转义序列。
// Traditional multi-line string
String old = "SELECT id, name, email\n" +
"FROM users\n" +
"WHERE active = true\n" +
"ORDER BY name;";
// Text block (Java 15+) — much cleaner
String sql = """
SELECT id, name, email
FROM users
WHERE active = true
ORDER BY name;
""";
System.out.println(sql);缩进处理
文本块会自动去除共同的前导空白字符。结束 """ 的位置决定缩进方式。
// Leading spaces up to the closing """ are stripped
String json = """
{
"name": "Alice",
"role": "admin"
}
""";
// Output has no leading spaces (stripped by common indent)
System.out.println(json);
// {
// "name": "Alice",
// "role": "admin"
// }嵌入双引号
文本块中可以直接包含双引号而无需转义(只要不会出现连续的三个双引号)。单个 " 和 "" 都可以直接使用。
String html = """
<div class="container">
<p class="title">Hello, World!</p>
<a href="https://example.com">Click here</a>
</div>
""";
System.out.println(html);
// Note: no need to escape " inside the block使用文本块编写 JSON 模板
对于测试或配置中使用的 JSON、HTML、XML 和 SQL 模板,文本块特别实用。
String request = """
{
"email": "alice@example.com",
"password": "secret123",
"plan": "PRO"
}
""";
// In tests: compare expected JSON
String expected = """
{
"status": "created",
"id": 42
}
""";
// Perfect for MockMvc test assertions
System.out.println(request);将 formatted() 与文本块结合使用
将文本块与 formatted()(Java 15+)结合使用,可以创建参数化模板。
String name = "Alice";
long orderId = 1234L;
double total = 149.99;
String email = """
Dear %s,
Your order #%d has been confirmed.
Total charged: $%.2f
Thank you for shopping with us!
""".formatted(name, orderId, total);
System.out.println(email);
// Dear Alice,
// Your order #1234 has been confirmed.
// Total charged: $149.99文本块中的转义序列
文本块支持 \n、\t,以及 Java 14+ 提供的 \(续行)和 \s(保留行尾空白字符)。
// \s forces a space (preserves trailing whitespace on line)
String padded = """
line one \s
line two \s
""";
// \ (backslash at end of line) joins lines in source but keeps them as one
String poem = """
Roses are red, \
violets are blue.
""";
System.out.println(poem); // Roses are red, violets are blue.String.format 参考
String.format 的主要格式说明符:
- %s — String
- %d — 整数
- %f — 浮点数
- %.2f — 保留 2 位小数
- %n — 平台换行符
- %x — 十六进制
- %10d — 在 10 个字符宽度内右对齐
System.out.printf("%s | %d | %.2f | %X%n", "Item", 42, 9.99, 255);
// Item | 42 | 9.99 | FF
String formatted = String.format("%-20s %6.2f%n", "Mechanical Keyboard", 129.95);
System.out.print(formatted);
// Mechanical Keyboard 129.95
// Named format with text block
System.out.printf("""
Order: %s
Total: $%.2f
Status: %s%n""", "ORD-001", 99.99, "SHIPPED");文本块的 stripIndent 与 translateEscapes
有两个 String 方法可以处理文本块:stripIndent() 会移除共同的前导空白字符,translateEscapes() 会处理运行时字符串中的转义序列。
String raw = " hello\\n world";
System.out.println(raw); // hello\n world
System.out.println(raw.translateEscapes()); // hello (newline) world
// stripIndent removes common leading whitespace
String indented = " line 1\n line 2\n line 3";
System.out.println(indented.stripIndent()); // line 1\nline 2\nline 3实践:HTML 电子邮件模板
使用文本块构建参数化的 HTML 电子邮件模板。
static String buildWelcomeEmail(String name, String activationLink) {
return """
<!DOCTYPE html>
<html>
<body>
<h1>Welcome, %s!</h1>
<p>Click the link below to activate your account:</p>
<a href="%s">Activate Account</a>
</body>
</html>
""".formatted(name, activationLink);
}
System.out.println(buildWelcomeEmail("Alice",
"https://app.example.com/activate?token=abc123"));文本块与 String.join
对于项目列表,String.join 或 Collectors.joining 比文本块更加灵活。固定的多行内容请使用文本块,动态列表请使用连接操作。
import java.util.*;
import java.util.stream.*;
List<String> features = List.of("Unlimited storage", "Priority support", "AI assistant");
// Dynamic list: join
String bullet = features.stream()
.map(f -> " • " + f)
.collect(Collectors.joining("\n"));
System.out.println(bullet);
// • Unlimited storage
// • Priority support
// • AI assistant
// Fixed template: text block + formatted
String plan = """
PRO Plan — $29/month
Features:
%s
""".formatted(bullet);
System.out.println(plan);快速检查
文本块中结束 """ 的位置控制什么?
回顾:文本块与 String.format
要点:
- 文本块(Java 15+)使用三个双引号,并且无需转义即可保留多行结构
- 系统会根据结束 \"\"\" 的位置自动移除共同的前导空白字符
- 文本块中的双引号无需转义
- 请对文本块使用 .formatted() 来创建参数化模板
- String.format 说明符包括:%s、%d、%.2f、%n、%x,以及宽度和对齐标志
- 请在行尾使用 \s 保留尾随空格;请在行尾使用 \ 连接多行
常见问题解答
「文本块与 String.format」课时是免费的吗?
是的 — 「文本块与 String.format」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Java Academy 课程的其余内容,请升级到 CoddyKit PRO。 Java Academy 课程共包含 4 节课。
「文本块与 String.format」这节课中我会学到什么?
使用文本块编写多行字符串,并通过 String.format 格式模式格式化数据 你通过在浏览器中直接运行的动手代码来练习 Java Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 Java Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 Java Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 3 节课,共 4 节。
「文本块与 String.format」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 Java Academy 课中编写并运行代码吗?
能。每节 Java Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。
此课程中的所有课时
- String 不可变性与字符串池
- 使用 StringBuilder 高效拼接
- 文本块与 String.format
- 使用 Pattern 和 Matcher 处理正则表达式