Kotlin多行字符串
外观
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行的文本建议提取到外部资源文件
- 需要频繁修改的内容考虑使用字符串构建器模式
延伸阅读[编辑 | 编辑源代码]
- Kotlin官方文档-字符串(外部链接)
- Effective Kotlin中关于字符串处理的建议(外部链接)