1. 概述

在 Kotlin 中,数组操作是一个常见的任务,而将数组的所有元素以一行的形式输出,是既实用又简洁的操作。

在本教程中,我们将探讨几种高效的方法,实现将字符串数组的所有元素单行输出,强调代码的可读性和简洁性。

2. 问题背景

我们知道可以直接使用 println() 函数输出一个列表(List),输出结果会被 [] 包裹,元素之间用逗号分隔:

println(listOf("A", "B", "C", "D", "E", "F"))
// 输出: [A, B, C, D, E, F]

但如果我们对数组使用 println(),Kotlin 并不会输出数组元素内容,而是会输出数组类型和对象的哈希值:

val myArray = arrayOf("A", "B", "C", "D", "E", "F")
println(myArray)
// 输出: [Ljava.lang.String;@fdefd3f

虽然我们可以使用 forEach 遍历数组并逐个打印每个元素,但这会导致每个元素单独占一行:

myArray.forEach { println(it) }
/* 输出:
A
B
C
D
E
F
*/

本教程的目标就是探讨如何将数组元素 以逗号分隔的形式,单行输出

此外,我们还需要考虑数组中元素包含逗号的情况。我们以如下数组为例进行说明:

val arrayWithComma = arrayOf("A", "B, C", "D, E", "F")

为了验证输出是否正确,我们会编写单元测试来捕获 println() 的输出结果。

3. 使用单元测试验证输出

直接验证 println() 的输出并不容易,但我们可以借助 Java 的 System.out.println() 实现机制来处理。基本思路是:将标准输出重定向到一个 ByteArrayOutputStream,从而捕获输出内容

我们可以这样设置测试环境:

val stdOut = System.out
val myOutput = ByteArrayOutputStream()

@BeforeEach
fun setup() {
    System.setOut(PrintStream(myOutput))
}

@AfterEach
fun restore() {
    System.setOut(stdOut)
}

然后编写简单的测试来验证是否能正确捕获输出:

val newLine = System.lineSeparator()

println("Hello, world")
assertEquals("Hello, world$newLine", myOutput.toString())

myOutput.reset()

println("Kotlin rocks")
assertEquals("Kotlin rocks$newLine", myOutput.toString())

通过 reset() 方法,我们可以多次测试不同的 println() 输出。

4. 将字符串数组转换为列表

我们知道 println() 可以将列表以单行形式输出,所以我们可以将数组转换为列表再打印:

println(myArray.asList())
assertEquals("[A, B, C, D, E, F]$newLine", myOutput.toString())

这是最简单直接的方法。

但如果我们使用包含逗号的数组:

myOutput.reset()

println(arrayWithComma.asList())
assertEquals("[A, B, C, D, E, F]$newLine", myOutput.toString())

输出结果中的逗号就无法区分是元素之间的分隔符还是元素本身的内容,这会导致歧义。

✅ 优点:简单、易用
❌ 缺点:无法自定义格式,元素含逗号时输出不清晰

5. 使用 forEachprint()

println() 每次输出都会自动换行,而 print() 不会。因此我们可以结合 forEachIndexedprint() 手动控制输出格式:

myArray.forEachIndexed { idx, e ->
    print(if (idx == myArray.lastIndex) "$e$newLine" else "$e, ")
}
assertEquals("A, B, C, D, E, F$newLine", myOutput.toString())

对于含逗号的数组,我们可以用双引号包裹每个元素以避免歧义:

myOutput.reset()

arrayWithComma.forEachIndexed { idx, e ->
    print(if (idx == arrayWithComma.lastIndex) """"$e"$newLine""" else """"$e", """)
}
assertEquals(""""A", "B, C", "D, E", "F"$newLine""", myOutput.toString())

⚠️ 注意:这里我们使用了 Kotlin 的三引号字符串(raw string),避免了转义字符的麻烦。

✅ 优点:格式可控
❌ 缺点:代码稍显繁琐

6. 使用 joinToString() 函数

更推荐的方式是使用 Kotlin 提供的 joinToString() 扩展函数,它能将数组元素拼接为一个字符串,并允许我们自定义格式:

println(myArray.joinToString { it })
assertEquals("A, B, C, D, E, F$newLine", myOutput.toString())

对于包含逗号的数组,我们可以轻松地将每个元素加上双引号:

myOutput.reset()

println(arrayWithComma.joinToString { """"$it"""" })
assertEquals(""""A", "B, C", "D, E", "F"$newLine""", myOutput.toString())

✅ 优点:代码简洁、可定制格式、可读性高
✅ 推荐作为首选方式

7. 总结

本文介绍了几种在 Kotlin 中将字符串数组的所有元素以单行形式输出的方法:

方法 优点 缺点
转换为 List 简单直接 无法定制格式
使用 forEach + print() 格式可控 代码较复杂
使用 joinToString() 简洁、灵活、可定制

在实际开发中,**推荐使用 joinToString()**,它在代码简洁性和可维护性方面表现最佳。

完整代码示例可在 GitHub 仓库 获取。


原始标题:Printing All Elements of a String Array in a Single Line in Kotlin