【发布时间】:2017-05-25 19:18:17
【问题描述】:
一个非常基本的问题,在 Kotlin 中连接字符串的正确方法是什么?
在 Java 中,您将使用 concat() 方法,例如
String a = "Hello ";
String b = a.concat("World"); // b = Hello World
concat() 函数不适用于 Kotlin。我应该使用+ 符号吗?
【问题讨论】:
一个非常基本的问题,在 Kotlin 中连接字符串的正确方法是什么?
在 Java 中,您将使用 concat() 方法,例如
String a = "Hello ";
String b = a.concat("World"); // b = Hello World
concat() 函数不适用于 Kotlin。我应该使用+ 符号吗?
【问题讨论】:
在 Kotlin 中,您可以使用 String interpolation/templates 进行连接:
val a = "Hello"
val b = "World"
val c = "$a $b"
输出将是:Hello World
StringBuilder 用于String templates,这是内存方面最有效的方法,因为+/plus() creates new String objects。
或者您可以使用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
【讨论】:
a.plus(b)或a + b,生成相同的字节码
"Hello" + "Word" 与使用 StringBuilder 附加到字符串 someHelloStringBuilder.append("World") 一样高效?
kotlin.String 有一个plus 方法:
a.plus(b)
详情请见https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-string/plus.html。
【讨论】:
+ 操作符是正常的,没有调用翻译后的操作符函数plus ...这不是惯用的
a = a.plus(b)
plus() 不如 StringBuilder 的 append 方法实用,即。
我同意上面接受的答案,但它只适用于已知的字符串值。 对于动态字符串值,这是我的建议。
// 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
这对于用分隔符连接字符串列表很有用。
【讨论】:
是的,您可以使用+ 符号进行连接。 Kotlin 有字符串模板,所以最好像这样使用它们:
var fn = "Hello"
var ln = "World"
"$fn $ln" 用于连接。
您甚至可以使用String.plus() 方法。
【讨论】:
+ 操作符是正常的,没有调用翻译后的操作符函数plus ...这不是惯用的
试试这个,我认为这是在 Kotlin 中连接字符串的原生方式:
val result = buildString{
append("a")
append("b")
}
println(result)
// you will see "ab" in console.
【讨论】:
buildString { 而不是stringBuild {
类似于@Rhusfer answer 我写了这个。如果您有一组 EditTexts 并且想要连接它们的值,您可以这样写:
listOf(edit_1, edit_2, edit_3, edit_4).joinToString(separator = "") { it.text.toString() }
如果你想连接Map,使用这个:
map.entries.joinToString(separator = ", ")
连接Bundle、use
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"
使用 + 运算符
a+b
使用plus() 运算符
a.plus(b)
注意 - + 仅在内部转换为 .plus() 方法
在上述两种方法中,由于字符串是不可变的,因此创建了一个新的字符串对象。如果我们想修改现有的字符串,我们可以使用 StringBuilder
StringBuilder str = StringBuilder("Hello").append("World")
【讨论】:
yourString += "newString"
这样你可以连接一个字符串
【讨论】:
我建议如果您有一组有限且预定义的值,那么最有效和可读的方法是使用字符串模板(它使用字符串生成器来执行连接)。
val a = "Hello"
val b = "World"
val c = "$a ${b.toUpperCase()} !"
println(c) //prints: Hello WORLD !
另一方面,如果您有一组值,则使用 joinToString 方法。
val res = (1..100).joinToString(",")
println(res) //prints: 1,2,3,...,100
我认为这篇文章中一些建议的解决方案效率不高。就像使用加号或 + 或为一组有限的条目创建一个集合,然后在它们上应用 joinToString。
【讨论】:
如果你有一个对象并且想要连接一个对象的两个值,比如
data class Person(
val firstName: String,
val lastName: String
)
那么简单的跟随是行不通的
val c = "$person.firstName $person.lastName"
在这种情况下正确的方法是
"${person.firstName} ${person.lastName}"
如果你想在连接的值之间有任何字符串,只需写在那里而不需要任何帮助符号。例如,如果我想要“Name is”,然后在名字和姓氏之间加一个连字符
"Name is ${person.firstName}-${person.lastName}"
【讨论】:
目前最简单的方法,它将添加分隔符并从连接中排除空/空字符串:
val finalString = listOf(a, b, c)
.filterNot { it.isNullOrBlank() }
.joinToString(separator = " ")
【讨论】:
在 Kotlin 中,我们可以使用 joinToString() 连接字符串数组
val tags=arrayOf("hi","bye")
val finalString=tags.joinToString (separator = ","){ "#$it" }
结果是:
#嗨,#再见
如果列表来自服务器
var tags = mutableListOf<Tags>() // list from server
val finalString=tags.joinToString (separator = "-"){ "#${it.tagname}" }
结果是:
#hi-#再见
【讨论】: