Kotlin - How to correctly concatenate a String

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

在 Java 中,你可以使用 concat()方法,例如。

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

但是考特林没有 concat()函数。我应该使用 +符号吗?

158276 次浏览

字符串模板/插值

在 Kotlin,你可以使用 abc0连接:

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

输出将是: Hello World

  • 编译器对于 < a href = “ https://kotlinlang.org/docs/reference/basic-syntax.html # using-String-template”rel = “ noReferrer”> String template 使用 StringBuilder,这是在内存方面最有效的方法,因为 +/plus() creates new String objects

Or you can concatenate using the StringBuilder explicitly.

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

  • 这将创建一个新的 String 对象。

kotlin.String采用 plus方法:

a.plus(b)

See https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-string/plus.html for details.

是的,你可以使用 +符号连接。 Kotlin 有字符串模板,所以最好这样使用它们:

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

"$fn $ln" for concatenation.

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

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

// 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

这对于用分隔符串联字符串列表很有用。

@ Rhusfer 回答类似,我写了这个。如果您有一组 EditText并希望连接它们的值,您可以写:

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

If you want to concatenate Map, use this:

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

在 kotlin 中串接字符串的方法有很多种 例子-

a = "Hello" , b= "World"
  1. Using + operator a+b

  2. Using plus() operator

    a.plus(b)

Note-+ 仅在内部转换为. plus ()方法

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

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

yourString += "newString"

这样就可以连接字符串

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

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


println(result)


// you will see "ab" in console.

在 Kotlin,我们可以使用 joinToString()连接字符串数组

val tags=arrayOf("hi","bye")


val finalString=tags.joinToString (separator = ","){ "#$it" }

结果是:

# Hi,# bye


如果列表来自服务器

var tags = mutableListOf<Tags>() // list from server


val finalString=tags.joinToString (separator = "-"){ "#${it.tagname}" }

结果是:

- 嗨-再见

我建议,如果您有一个有限的和预定义的值集,那么最有效和可读的方法是使用字符串模板(它使用字符串生成器来执行连接)。

val a = "Hello"
val b = "World"
val c = "$a  ${b.toUpperCase()} !"


println(c) //prints: Hello  WORLD !

另一方面,如果您有一个值集合,那么使用 JoToString方法。

val res = (1..100).joinToString(",")
println(res) //prints: 1,2,3,...,100

我认为这篇文章中提出的一些解决方案是没有效率的。比如使用 plus 或 + ,或者为一组有限的 entris 创建一个集合,然后对它们应用 JoToString

如果您有一个对象并且想要连接一个对象的两个值,如

data class Person(
val firstName: String,
val lastName: String
)

那么简单的跟随是行不通的

val c = "$person.firstName $person.lastName"

在这种情况下,正确的方式将是

"${person.firstName} ${person.lastName}"

如果您希望在连接的值之间有任何字符串,只需在那里写入,而不需要任何辅助符号。例如,如果我想“名字是”,然后一个连字符之间的名字和姓然后

 "Name is ${person.firstName}-${person.lastName}"

到目前为止的 最简单的方法add separator排除空/空字符串从串联:

val finalString = listOf(a, b, c)
.filterNot { it.isNullOrBlank() }
.joinToString(separator = " ")

字符串串联的最佳方式是 Kotlin 的 ABc0。

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.

Kotlin 惯用的字符串插值方法如下

val helloString = "Hello"
val worldString = "World"
val concatString = "$helloString $worldString"

输出

Hello World