0Pricing
Java Academy · 课时

文本块与 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 反馈 — 无需本地设置。

此课程中的所有课时

  1. String 不可变性与字符串池
  2. 使用 StringBuilder 高效拼接
  3. 文本块与 String.format
  4. 使用 Pattern 和 Matcher 处理正则表达式
← 返回 Java Academy