1. 简介
本文将介绍 Kotlin 中常见的字符串拼接方式,帮助你在不同场景下选择最合适的方法。
2. 使用 plus() 方法
Kotlin 的 String
类提供了一个 plus()
方法用于拼接字符串:
operator fun plus(other: Any?): String
该方法返回一个新的字符串,由调用者和传入的对象拼接而成。例如:
@Test
fun givenTwoStrings_concatenateWithPlusMethod_thenEquals() {
val a = "Hello"
val b = "Baeldung"
val c = a.plus(" ").plus(b)
assertEquals("Hello Baeldung", c)
}
⚠️ 注意:如果传入的不是字符串类型,会自动调用其 toString()
方法进行转换。
3. 使用 + 运算符
这是 Kotlin 中最常用的字符串拼接方式:
@Test
fun givenTwoStrings_concatenateWithPlusOperator_thenEquals() {
val a = "Hello"
val b = "Baeldung"
val c = a + " " + b
assertEquals("Hello Baeldung", c)
}
✅ 说明:
- Kotlin 支持运算符重载,+ 实际上调用了
plus()
方法 - 适合拼接少量字符串,代码简洁易读
4. 使用 StringBuilder
由于字符串是不可变对象,每次拼接都会生成新对象。大量拼接时推荐使用 StringBuilder
,以提升性能。
@Test
fun givenTwoStrings_concatenateWithStringBuilder_thenEquals() {
val builder = StringBuilder()
builder.append("Hello")
.append(" ")
.append("Baeldung")
assertEquals("Hello Baeldung", builder.toString())
}
✅ 说明:
- 通过内部缓冲区减少对象创建
- 线程安全场景可使用
StringBuffer
5. 使用字符串模板(String Templates)
Kotlin 支持字符串模板,可以在字符串中嵌入变量或表达式:
@Test
fun givenTwoStrings_concatenateWithTemplates_thenEquals() {
val a = "Hello"
val b = "Baeldung"
val c = "$a $b"
assertEquals("Hello Baeldung", c)
}
编译器会将其转换为:
new StringBuilder().append(a).append(" ").append(b).toString()
✅ 说明:
- 语法简洁,适合动态拼接
- 支持表达式插值(Interpolation)
6. 拼接逗号分隔的字符串
6.1 使用 joinToString() 方法
这是最推荐的方式,适用于 List 中字符串的拼接。
定义一个水果列表:
val fruitsList = listOf("apple", "banana", "orange")
使用逗号拼接:
val fruitsCsv = fruitsList.joinToString(",")
assertEquals("apple,banana,orange", fruitsCsv)
支持格式转换:
val fruitsUppercaseCsv = fruitsList.joinToString(",") { it.uppercase() }
assertEquals("APPLE,BANANA,ORANGE", fruitsUppercaseCsv)
支持条件过滤:
val fruitsFilteredCsv = fruitsList.filter { it.startsWith("b") || it.startsWith("o") }
.joinToString(",")
assertEquals("banana,orange", fruitsFilteredCsv)
✅ 说明:功能强大,推荐首选
6.2 使用 reduce() 方法
适用于需要自定义拼接逻辑的场景:
val fruitsCsv = fruitsList.reduce { acc, str -> "$acc,$str" }
assertEquals("apple,banana,orange", fruitsCsv)
⚠️ 注意:如果列表为空会抛出异常,使用前应确保列表非空。
6.3 使用 StringBuilder 手动拼接
适合对性能有极致要求的场景:
val fruitsCsvBuilder = StringBuilder()
for ((index, str) in fruitsList.withIndex()) {
fruitsCsvBuilder.append(str)
if (index < fruitsList.size - 1) {
fruitsCsvBuilder.append(",")
}
}
val fruitsCsv = fruitsCsvBuilder.toString()
验证结果:
assertEquals("apple,banana,orange", fruitsCsv)
✅ 说明:
- 控制粒度高
- 适合处理复杂格式拼接
7. 总结
方法 | 适用场景 | 优点 | 缺点 |
---|---|---|---|
plus() |
简单拼接 | 语法直观 | 性能差 |
+ 运算符 |
少量拼接 | 简洁易读 | 频繁创建对象 |
StringBuilder |
大量拼接 | 高性能 | 代码略繁琐 |
字符串模板 | 动态拼接 | 语法优雅 | 适合简单场景 |
joinToString() |
列表拼接、格式转换、过滤 | 功能丰富、语法简洁 | 仅适用于集合场景 |
reduce() |
自定义拼接逻辑 | 灵活 | 易出错,需注意空集合 |
手动拼接 | 极致性能控制 | 完全自定义 | 代码复杂,维护成本高 |
📌 建议:
- 优先使用
joinToString()
和字符串模板 - 大量拼接使用
StringBuilder
- 避免频繁使用
+
或plus()
拼接循环体中的字符串
所有示例代码可在 GitHub 仓库 中找到。