跳转到内容

Kotlin多行字符串

来自代码酷
Admin留言 | 贡献2025年5月2日 (五) 00:18的版本 (Page creation by admin bot)

(差异) ←上一版本 | 已核准修订 (差异) | 最后版本 (差异) | 下一版本→ (差异)


Kotlin多行字符串是Kotlin语言中用于处理包含换行符或复杂格式文本的特殊字符串类型。它通过三重引号("""语法实现,避免了传统字符串中繁琐的转义字符需求,特别适合处理SQL查询、HTML模板或格式化文本等场景。

基本语法[编辑 | 编辑源代码]

Kotlin的多行字符串使用三个双引号定义,其内容会原样保留所有换行和缩进

val multilineString = """
    This is a multiline string
    Line breaks and    spaces
    are preserved exactly.
"""
println(multilineString)

输出结果:

    This is a multiline string
    Line breaks and    spaces
    are preserved exactly.

注意:多行字符串的起始和结束引号必须单独成行,且内容缩进以结束引号的位置为基准。

去除前导空白[编辑 | 编辑源代码]

使用trimIndent()函数可自动去除所有行的共同最小缩进

val indentedText = """
        First line
        Second line
    """.trimIndent()
println(indentedText)

输出结果:

First line
Second line

边缘对齐控制[编辑 | 编辑源代码]

通过trimMargin()函数和指定的边界字符(默认为|)控制对齐:

val marginText = """
    |Left-aligned
    |  With indentation
""".trimMargin()
println(marginText)

输出结果:

Left-aligned
  With indentation

字符串模板支持[编辑 | 编辑源代码]

多行字符串完全支持Kotlin的字符串模板功能:

val name = "Alice"
val greeting = """
    Hello, $name!
    Today is ${java.time.LocalDate.now()}
""".trimIndent()
println(greeting)

示例输出(日期会变化):

Hello, Alice!
Today is 2023-08-20

实际应用案例[编辑 | 编辑源代码]

场景1:SQL查询构建[编辑 | 编辑源代码]

val userId = 42
val query = """
    SELECT * FROM users
    WHERE id = $userId
    AND status = 'ACTIVE'
""".trimIndent()

场景2:HTML模板[编辑 | 编辑源代码]

fun createEmailTemplate(name: String): String {
    return """
        <html>
            <body>
                <h1>Hello, $name!</h1>
                <p>Thank you for registering.</p>
            </body>
        </html>
    """.trimIndent()
}

高级技巧[编辑 | 编辑源代码]

自定义边界标记[编辑 | 编辑源代码]

可以指定任意字符作为trimMargin的分隔符:

val customMargin = """
    #Line 1
    #  Line 2
""".trimMargin("#")

原始字符串与转义符[编辑 | 编辑源代码]

多行字符串内依然可以使用转义符,但需注意:

  • 反斜杠\仍作为转义字符
  • 如需包含"""则必须转义:\"""
val escaped = """
    This shows a \n newline symbol
    And a triple quote: \"""
"""

性能考虑[编辑 | 编辑源代码]

多行字符串在编译时会被转换为普通字符串常量,与单行字符串相比:

  • 内存占用:相同内容下无显著差异
  • 编译时间:处理复杂多行字符串可能略微增加编译时间
  • 运行时性能:完全一致

与其他语言对比[编辑 | 编辑源代码]

特性 Kotlin Java Python
语法标记 """ """(Java 15+) """
缩进处理 trimIndent() String.stripIndent() 自动去除共同缩进
边界控制 trimMargin() 无内置支持 无内置支持

常见问题[编辑 | 编辑源代码]

问题1:如何包含前导/后置空行?[编辑 | 编辑源代码]

在开始/结束引号后直接换行即可:

val withEmptyLines = """

    Actual content starts here

"""

问题2:为什么我的缩进没有正确去除?[编辑 | 编辑源代码]

确保所有行的缩进一致,且不超过结束引号的位置。使用IDE的自动格式化功能可避免此问题。

最佳实践[编辑 | 编辑源代码]

  • 优先使用trimIndent()而非手动调整缩进
  • 复杂模板考虑使用专门的模板引擎(如Kotlinx.HTML)
  • 超过50行的文本建议提取到外部资源文件
  • 需要频繁修改的内容考虑使用字符串构建器模式

延伸阅读[编辑 | 编辑源代码]