Kotlin - 如何正确拼接字符串

131

一个非常基本的问题,Kotlin中连接字符串的正确方法是什么?

在Java中,您可以使用concat()方法,例如:

String a = "Hello ";
String b = a.concat("World"); // b = Hello World

concat()函数在Kotlin中不可用。我应该使用加号+吗?

返回:

concat()函数在Kotlin中不可用。我应该使用加号+吗?

15个回答

204

字符串模板/插值

在 Kotlin 中,您可以使用字符串插值/模板进行连接:

val a = "Hello"
val b = "World"
val c = "$a $b"

输出结果将是: Hello World

或者您可以显式地使用StringBuilder进行连接。

val a = "Hello"
val b = "World"

val sb = StringBuilder()
sb.append(a).append(b)
val c = sb.toString()

print(c)

输出结果将是:HelloWorld

新字符串对象

或者您可以使用+ / plus() 运算符进行连接:

val a = "Hello"
val b = "World"
val c = a + b   // same as calling operator function a.plus(b)

print(c)

输出结果将是:HelloWorld
  • 这将创建一个新的字符串对象。

9
运算符"+"被翻译为plus(),所以您可以写成a.plus(b)a + b,生成的字节码相同。 - D3xter
27
我研究了字节码,发现字符串插值在内部使用了 StringBuilder。 - crgarridos
1
@crgarridos,这是否意味着在Kotlin中使用字符串插值进行连接"Hello" + "Word"与使用StringBuilder追加字符串somHelloStringBuilder.append("World")的性能相同? - AdamHurwitz
2
字符串插值是指在字面字符串内解析变量。所以从技术上讲,是的。 - crgarridos
字符串插值和连接都在内部使用StringBuilder。我注意到字节码中唯一的区别是,如果在两个变量之间只有一个字符,则插值会使用append(Char)而不是append(String)来添加此字符。因此,我会说这只是语法糖。在单个变量上执行多个连接时,例如在for循环中,使用StringBuilder非常重要。 - Miloš Černilovský
我刚开始学习Kotlin,所以这可能是一个愚蠢的问题,但我认为val值是不能被更改的。那么为什么我可以写出以下代码:val name = StringBuilder("Peter") name.append("Pan")这不会改变name变量吗?谢谢 :) - james

29

4
+ 运算符是正常的,不会调用翻译后的运算符函数 plus ... 这不符合惯用写法。 - Jayson Minard
为什么你这么认为? - incises
5
记得像我一样影响你的结果,比如说 a = a.plus(b) - lorenzo
1
@lorenzo的评论解释了为什么这个答案不如上面的解决方案可取。当连接取决于多个if语句时,plus()StringBuilder的append方法不太实用。 - Panos Gr

13

我同意上面所接受的答案,但它只适用于已知的字符串值。对于动态字符串值,这是我的建议。

// A list may come from an API JSON like
{
   "names": [
      "Person 1",
      "Person 2",
      "Person 3",
         ...
      "Person N"
   ]
}
var listOfNames = mutableListOf<String>() 

val stringOfNames = listOfNames.joinToString(", ") 
// ", " <- a separator for the strings, could be any string that you want

// Posible result
// Person 1, Person 2, Person 3, ..., Person N
这对于使用分隔符串联字符串列表非常有用。

这对于使用分隔符串联字符串列表非常有用。


12

试着用这个方法,我认为这是Kotlin中本地连接字符串的一种方式:

val result = buildString{
    append("a")
    append("b")
}

println(result)

// you will see "ab" in console.

1
应该是 buildString { 而不是 stringBuild { - arnonuem
@arnonuem 我已经修复了它(正如你应该随意做的那样)。 - Ellen Spertus

10

是的,您可以使用加号符进行字符串拼接。Kotlin具有字符串模板的功能,因此最好像这样使用它们:

是的,您可以使用加号符进行字符串拼接。Kotlin具有字符串模板的功能,因此最好像这样使用它们:

var fn = "Hello"
var ln = "World"

"$fn $ln" 用于拼接字符串。

你甚至可以使用 String.plus() 方法。


+ 运算符是正常的,不会调用翻译后的 plus 运算符函数...这不是惯用语。 - Jayson Minard
请问您能否解释一下为什么您认为加号的加号版本不符合惯用语? - incises

8

类似于@Rhusfer的答案,我写了这个。假如你有一组EditText并且想要将它们的值连接起来,那么你可以这样写:

listOf(edit_1, edit_2, edit_3, edit_4).joinToString(separator = "") { it.text.toString() }

如果您想连接 Map,请使用以下方法:

map.entries.joinToString(separator = ", ")

如果需要将 Bundle 进行连接,请使用下述方法:

bundle.keySet().joinToString(", ") { key -> "$key=${bundle[key]}" }

它会按字母顺序对键进行排序。

例如:

val map: MutableMap<String, Any> = mutableMapOf("price" to 20.5)
map += "arrange" to 0
map += "title" to "Night cream"
println(map.entries.joinToString(separator = ", "))

// price=20.5, arrange=0, title=Night cream

val bundle = bundleOf("price" to 20.5)
bundle.putAll(bundleOf("arrange" to 0))
bundle.putAll(bundleOf("title" to "Night cream"))
val bundleString =
    bundle.keySet().joinToString(", ") { key -> "$key=${bundle[key]}" }
println(bundleString)

// arrange=0, price=20.5, title=Night cream

3
到目前为止,最简单的方法是将分隔符添加到连接中,并从连接中排除空/ null字符串:
val finalString = listOf(a, b, c)
    .filterNot { it.isNullOrBlank() }
    .joinToString(separator = " ")

3

在Kotlin中,有多种连接字符串的方式。 例如 -

a = "Hello" , b= "World"
  1. 使用 + 操作符 a+b

  2. 使用 plus() 方法

    a.plus(b)

注意 - + 实际上会被转换为 .plus() 方法

在以上两种方法中,由于字符串是不可变的,因此会创建一个新的字符串对象。如果我们想要修改现有的字符串,可以使用 StringBuilder。

StringBuilder str = StringBuilder("Hello").append("World")

3
在Kotlin中,最好的字符串拼接方式是字符串插值
val a = "Hello"
val b = "World"

val mString = "$a $b"
val sString = "${a, b}, I am concatenating different string with."

//Output of mString : Hello World
//Output of sString : Hello World, I am concatenating different string with.

3
在Kotlin中,进行字符串插值的惯用方式如下:
val helloString = "Hello"
val worldString = "World"
val concatString = "$helloString $worldString"

输出

Hello World

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接