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 仓库 中找到。


原始标题:Concatenate Strings in Kotlin