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 生成了字符串。 (因此 length
、lastOrNull()
和 append
指的是 StringBuilder。)
对于短代码,这样可以明显更简洁明了;尽管代码越长,好处就越不明显。 (你的代码可能在灰色地带……)
值得指出的是函数名称具有误导性:它避免了重复字符,但允许不连续的重复字符。如果这是故意的,那么值得在函数名称中明确说明(and/or 它的文档注释)。或者,如果目的是避免 all 重复,那么有一种更简单 and/or 更有效的方法:洗牌范围(或至少部分范围)。
使用现有的库函数,并使其成为 CharRange 的扩展函数,整个事情可以像这样简单:
fun CharRange.randomChars(n: Int) = shuffled().take(n).joinToString("")
这会打乱整个列表,即使只需要几个字符也是如此。因此,只洗牌需要的部分会更有效率。但是没有库函数,所以你必须手动编写。我会把它留作练习!
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 生成了字符串。 (因此 length
、lastOrNull()
和 append
指的是 StringBuilder。)
对于短代码,这样可以明显更简洁明了;尽管代码越长,好处就越不明显。 (你的代码可能在灰色地带……)
值得指出的是函数名称具有误导性:它避免了重复字符,但允许不连续的重复字符。如果这是故意的,那么值得在函数名称中明确说明(and/or 它的文档注释)。或者,如果目的是避免 all 重复,那么有一种更简单 and/or 更有效的方法:洗牌范围(或至少部分范围)。
使用现有的库函数,并使其成为 CharRange 的扩展函数,整个事情可以像这样简单:
fun CharRange.randomChars(n: Int) = shuffled().take(n).joinToString("")
这会打乱整个列表,即使只需要几个字符也是如此。因此,只洗牌需要的部分会更有效率。但是没有库函数,所以你必须手动编写。我会把它留作练习!