1. 简介

在 Kotlin 中,List 是最常用的集合类型之一,而将一个元素集合转换为字符串(String)也是开发中非常常见的需求。例如,我们可能需要把一组数字、字符或字符串拼接成一个完整的字符串用于日志输出、界面展示或接口调用。

本文将介绍几种在 Kotlin 中将 List 转换为 String 的常用方法,并分析它们的适用场景与性能差异。


2. 使用 joinToString 方法转换 List 为 String

Kotlin 的集合类库中提供了非常实用的方法 joinToString,它能将集合中的所有元素拼接成一个字符串。默认情况下,元素之间用逗号 , 分隔。

示例:

val numbers = listOf(11, 22, 3, 41, 52, 6)
val string = numbers.joinToString()
assertEquals("11, 22, 3, 41, 52, 6", string)

你也可以通过参数自定义拼接格式:

  • separator:元素之间的分隔符
  • prefix:拼接前缀
  • postfix:拼接后缀
  • limit:限制元素个数
  • truncated:超出 limit 时的提示字符串
  • transform:每个元素的转换函数

示例:

val chars = charArrayOf('h', 'e', 'l', 'l', 'o', 'o', 'o', 'o')
val string = chars.joinToString(separator = "", limit = 5, truncated = "!") { it.uppercaseChar().toString() }
assertEquals("HELLO!", string)

✅ 推荐使用场景:简洁、可读性强,适合大多数常规拼接需求。


3. 使用 joinTo 将 List 拼接到已有字符串中

如果你已经有了一个字符串,并希望将 List 中的元素追加到其后,可以使用 joinTo 方法。

它会使用 StringBuilder 来拼接内容,从而避免频繁创建新字符串对象,提高性能。

示例:

val sb = StringBuilder("An existing string and a list: ")
val numbers = listOf(11, 22, 3, 41, 52, 6)
val string = numbers.joinTo(sb).toString()
assertEquals("An existing string and a list: 11, 22, 3, 41, 52, 6", string)

⚠️ 注意:joinTo 接收一个实现了 Appendable 接口的对象,Kotlin 标准库中只有 StringBuilder 实现了该接口。


4. 使用 reduce 与 fold 构建字符串

4.1 reduce 方法

reduce 可以将集合中的元素依次聚合,适用于需要在拼接过程中进行逻辑判断或处理的场景。

示例:

val strings = listOf("a", "b", "a", "c", "c", "d", "b", "a")
val uniqueSubstrings = strings.reduce { acc, string -> if (string !in acc) acc + string else acc }
assertEquals("abcd", uniqueSubstrings)

⚠️ 缺点:

  • 每次迭代都会创建新的 String 对象,性能较差
  • 若集合为空,会抛出异常

4.2 fold 方法(推荐)

foldreduce 类似,但需要提供一个初始值,更安全且适合处理空集合。

示例:

val strings = listOf("a", "b", "a", "c", "c", "d", "b", "a")
val uniqueSubstrings =
    strings.fold(StringBuilder()) { acc, string -> if (string !in acc) acc.append(string) else acc }
assertEquals("abcd", uniqueSubstrings.toString())

✅ 优势:

  • 使用 StringBuilder 避免频繁创建对象
  • 支持空集合处理

5. 使用循环拼接字符串

最原始的方法是通过 for 循环逐个拼接字符串:

val elements = listOf("a", "b", "c", "d", "e")
var string = ""

for(s in elements){
    string += s
}

assertEquals("abcde", string)

⚠️ 缺点:每次 += 都会创建新字符串对象,效率低下,尤其在处理大数据量时应避免。

优化方式:使用 StringBuilder

val letters = listOf("a", "b", "c", "d", "e", "f")
val builder = StringBuilder()

for(s in letters){
    builder.append(s)
}

assertEquals("abcdef", builder.toString())

Kotlin 还提供了语法糖 buildString,使用更简洁:

val letters = listOf("a", "b", "c", "d", "e", "f")
val alreadyAString = buildString { for (s in letters) append(s) }
assertEquals("abcdef", alreadyAString)

✅ 优势:代码简洁,性能良好。


6. 总结

方法 适用场景 优点 缺点
joinToString 快速拼接,格式化输出 简洁、可定制 不支持拼接到已有字符串
joinTo 追加到已有字符串 高效,使用 StringBuilder 依赖 Appendable 实现
reduce 简单聚合逻辑 灵活 性能差,不支持空集合
fold 带初始值的聚合 安全、性能好 代码略复杂
循环 + StringBuilder 灵活控制拼接逻辑 可控性强 代码冗长
buildString 简洁拼接 易读、高效 Kotlin 特有语法

✅ 推荐优先使用 joinToStringbuildString,性能和可读性俱佳。对于需要逻辑处理的场景,使用 fold 是更安全和高效的选择。

所有完整示例源码可在 GitHub 仓库 中找到。


原始标题:Convert List to String in Kotlin