String Kotlin-如何正确连接字符串
一个非常基本的问题,在Kotlin中连接字符串的正确方法是什么 在Java中,您将使用String Kotlin-如何正确连接字符串,string,kotlin,String,Kotlin,一个非常基本的问题,在Kotlin中连接字符串的正确方法是什么 在Java中,您将使用concat()方法,例如 String a = "Hello "; String b = a.concat("World"); // b = Hello World 但是,Kotlin无法使用concat()函数。我应该使用+符号吗?字符串模板/插值 在Kotlin中,可以使用以下方法连接: 输出将是:Hello World 编译器使用内存方面最有效的方法,因为+/ 或者可以使用显式连接 val a =
concat()
方法,例如
String a = "Hello ";
String b = a.concat("World"); // b = Hello World
但是,Kotlin无法使用concat()
函数。我应该使用+
符号吗?字符串模板/插值
在Kotlin中,可以使用以下方法连接:
输出将是:Hello World
- 编译器使用内存方面最有效的方法,因为
/+
val a = "Hello"
val b = "World"
val sb = StringBuilder()
sb.append(a).append(b)
val c = sb.toString()
print(c)
输出将是:HelloWorld
新字符串对象
或者可以使用+
/运算符连接:
val a = "Hello"
val b = "World"
val c = a + b // same as calling operator function a.plus(b)
print(c)
输出将是:HelloWorld
- 这将创建一个新的字符串对象
kotlin.String
有一个plus
方法:
a.plus(b)
有关详细信息,请参阅。是的,可以使用
+
符号连接。Kotlin有字符串模板,因此最好像这样使用它们:
var fn = "Hello"
var ln = "World"
“$fn$ln”
用于连接
您甚至可以使用
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
//列表可能来自类似JSON的API
{
“姓名”:[
“第1人”,
“第二人”,
“第三人”,
...
“人N”
]
}
var listOfNames=mutableListOf()
val stringOfNames=listOfNames.joinToString(“,”)
//“,”类似于我写的这个。如果您有一组EditText
s并希望连接它们的值,您可以编写:
listOf(edit_1, edit_2, edit_3, edit_4).joinToString(separator = "") { it.text.toString() }
如果要连接映射
,请使用以下命令:
map.entries.joinToString(separator = ", ")
要连接捆绑包
它按字母顺序对键进行排序
例如:
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
val-map:MutableMap=mutableMapOf(“价格”到20.5)
将+=“排列”映射到0
映射+=“标题”到“晚霜”
println(map.entries.joinToString(separator=“,”))
//价格=20.5,排列=0,标题=晚霜
val bundle=bundleOf(“价格”至20.5)
bundle.putAll(bundleOf(“排列”到0))
bundle.putAll(bundleOf(“标题”改为“晚霜”))
val束带=
bundle.keySet().joinToString(“,”{key->“$key=${bundle[key]}”
println(集束线)
//排列=0,价格=20.5,标题=晚霜
在kotlin中有多种连接字符串的方法
示例-
a = "Hello" , b= "World"
使用+运算符
a+b
使用plus()
运算符
a.plus(b)
注意-+仅在内部转换为.plus()方法
在上述两种方法中,由于字符串是不可变的,因此会创建一个新的字符串对象。如果要修改现有字符串,可以使用StringBuilder
StringBuilder str = StringBuilder("Hello").append("World")
yourString+=“新闻字符串”
通过这种方式可以连接字符串试试这个,我认为这是在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" }
结果是:
#你好,再见
如果列表来自服务器
var tags = mutableListOf<Tags>() // list from server
val finalString=tags.joinToString (separator = "-"){ "#${it.tagname}" }
var tags=mutableListOf()//来自服务器的列表
val finalString=tags.joinToString(分隔符=“-”{“#${it.tagname}}”
结果是:
#你好,再见
我建议,如果您有一组有限的预定义值,那么最有效和可读的方法是使用字符串模板(它使用字符串生成器执行concatation)
另一方面,如果有一组值,则使用joinToString方法
val res = (1..100).joinToString(",")
println(res) //prints: 1,2,3,...,100
我相信这篇文章中提出的一些解决方案是无效的。例如使用加号或+或为一组有限的entri创建一个集合,然后在其上应用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}"
运算符“+”被转换为plus(),因此您可以编写a.plus(b)
或a+b
,并生成相同的字节码。我查看字节码,字符串插值使用StringBuilderinternally@crgarridos,这是否意味着对于Kotlin,使用字符串插值进行串联“Hello”+“Word”
的性能与使用StringBuilder附加到字符串一样,someHelloStringBuilder.append(“World”)
?字符串插值指的是文本字符串内部变量的解析。所以从技术上讲是的。+
操作符是正常的,不调用翻译后的操作符函数plus
。。。这不是惯用语,你为什么这么认为?别忘了像我一样影响你的结果,比如a=a.plus(b)
forinstance@lorenzo的评论解释了为什么这个答案不如上述解决方案。当连接依赖于多个if语句时,plus()
不如StringBuilder
的append方法实用。+
运算符是正常的,不调用转换运算符函数plus
。。。这不是惯用语。你能解释一下为什么你认为+的加号版本不是惯用语吗?它是buildString{
而不是stringBuild{
@arnnuem。我已经修复了它(你应该可以这么做)。
val c = "$person.firstName $person.lastName"
"${person.firstName} ${person.lastName}"
"Name is ${person.firstName}-${person.lastName}"