StringBuffer 是像 java 那样处理多个字符串连接的 Kotlin 方法吗?

Is StringBuffer the Kotlin way to handle multiple string concatenation like in java?

kotlin 处理多个字符串连接的方法是什么?

--编辑-- 放置让我产生疑问的代码

fun getNCharsFromRange(n: Int, range: CharRange): String {
    val chars = range.toList()
    val buffer = StringBuffer()
    while (buffer.length < n) {
        val randomInt = Random.Default.nextInt(0, chars.lastIndex)
        val newchar = chars[randomInt]
        val lastChar = buffer.lastOrNull() ?: ""
        if (newchar != lastChar) {
            buffer.append(newchar)
        }
    }
    return buffer.toString()
}

A StringBuilder 是在 Kotlin 中构造字符串的标准方式,如 Java.

(除非它可以在一行中完成,当然,string template 通常比 Java 式连接更好。)

Kotlin 有一个改进,不过:您可以使用 buildString 来隐式处理它,这可以使代码更简洁一些。比如你的代码可以写成:

fun getNCharsFromRange(n: Int, range: CharRange): String {
    val chars = range.toList()
    return buildString {
        while (length < n) {
            val randomInt = Random.Default.nextInt(0, chars.lastIndex)
            val newChar = chars[randomInt]
            val lastChar = lastOrNull() ?: ""
            if (newChar != lastChar)
                append(newChar)
        }
    }
}

没有提到 buffer:相反,buildString 创建了一个 StringBuilder,使其作为 this 可用,然后 returns 生成了字符串。 (因此 lengthlastOrNull()append 指的是 StringBuilder。)

对于短代码,这样可以明显更简洁明了;尽管代码越长,好处就越不明显。 (你的代码可能在灰色地带……)


值得指出的是函数名称具有误导性:它避免了重复字符,但允许不连续的重复字符。如果这是故意的,那么值得在函数名称中明确说明(and/or 它的文档注释)。或者,如果目的是避免 all 重复,那么有一种更简单 and/or 更有效的方法:洗牌范围(或至少部分范围)。

使用现有的库函数,并使其成为 CharRange 的扩展函数,整个事情可以像这样简单:

fun CharRange.randomChars(n: Int) = shuffled().take(n).joinToString("")

这会打乱整个列表,即使只需要几个字符也是如此。因此,只洗牌需要的部分会更有效率。但是没有库函数,所以你必须手动编写。我会把它留作练习!