Kotlin - Cara menggabungkan String dengan benar

90

Pertanyaan yang sangat mendasar, apa cara yang tepat untuk menggabungkan String di Kotlin?

Di Java, Anda akan menggunakan concat()metode ini, misalnya

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

Namun, concat()fungsinya tidak tersedia untuk Kotlin. Haruskah saya menggunakan +tanda itu?

Daniele
sumber

Jawaban:

138

Template / Interpolasi String

Di Kotlin, Anda dapat menggabungkan menggunakan interpolasi / template String :

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

Outputnya adalah: Hello World

Atau Anda dapat menggabungkan menggunakan StringBuildersecara eksplisit.

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

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

print(c)

Outputnya adalah: HelloWorld

Objek String Baru

Atau Anda dapat menggabungkan menggunakan +/ plus()operator:

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

print(c)

Outputnya adalah: HelloWorld

  • Ini akan membuat objek String baru.
Avijit Karmakar
sumber
7
operator "+" diterjemahkan ke dalam plus (), sehingga Anda dapat menulis a.plus(b)atau a + bdan bytecode yang sama dihasilkan
D3xter
21
Saya melihat ke bytecode dan interpolasi string menggunakan StringBuilder secara internal
crgarridos
@crgarridos, Apakah ini berarti bahwa untuk Kotlin menggunakan interpolasi string untuk penggabungan "Hello" + "Word"sama performanya dengan menggunakan StringBuilder untuk menambahkan string someHelloStringBuilder.append("World"),?
Adam Hurwitz
1
interpolasi string mengacu pada resolusi variabel di dalam string literal. jadi secara teknis ya.
crgarridos
23

kotlin.Stringmemiliki plusmetode:

a.plus(b)

Lihat https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-string/plus.html untuk detailnya.

Harald Gliebe
sumber
3
The +operator adalah normal, tidak memanggil fungsi operator diterjemahkan plus ... ini bukan idiomatik
Jayson Minard
kenapa menurutmu begitu?
menorehkan
1
Jangan lupa untuk memengaruhi hasil Anda seperti yang saya lakukan, seperti a = a.plus(b)misalnya
lorenzo
Komentar @lorenzo menjelaskan mengapa jawaban ini kurang disukai daripada solusi di atas. Ketika penggabungan bergantung pada beberapa pernyataan if plus()kurang praktis daripada StringBuildermetode append yaitu.
Panos Gr
10

Saya setuju dengan jawaban yang diterima di atas tetapi ini hanya bagus untuk nilai string yang diketahui. Untuk nilai string dinamis, inilah saran saya.

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

Ini berguna untuk menggabungkan daftar string dengan pemisah.

Rhusfer
sumber
9

Ya, Anda dapat menggabungkan menggunakan +tanda. Kotlin memiliki template string, jadi lebih baik menggunakannya seperti:

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

"$fn $ln" untuk penggabungan.

Anda bahkan dapat menggunakan String.plus()metode.

Tushar
sumber
The +operator adalah normal, tidak memanggil fungsi operator diterjemahkan plus ... ini bukan idiomatik
Jayson Minard
Bisakah Anda menjelaskan mengapa menurut Anda versi plus dari + tidak idiomatis?
menorehkan
5

Coba ini, saya pikir ini adalah cara asli untuk menggabungkan string di Kotlin:

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

println(result)

// you will see "ab" in console.
Licat Julius
sumber
1
ini buildString {bukanstringBuild {
arnonuem
@arnonuem Saya telah memperbaikinya (seperti yang seharusnya Anda lakukan dengan bebas).
Ellen Spertus
5

Mirip dengan jawaban @Rhusfer, saya menulis ini. Jika Anda memiliki sekelompok EditTexts dan ingin menggabungkan nilainya, Anda dapat menulis:

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

Jika Anda ingin menggabungkan Map, gunakan ini:

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

Untuk menggabungkan Bundle, gunakan

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

Ini mengurutkan kunci dalam urutan abjad.

Contoh:

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
CoolMind
sumber
2

Ada berbagai cara untuk menggabungkan string di kotlin. Contoh -

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

  2. Menggunakan plus()operator

    a.plus(b)

Catatan - + secara internal dikonversi ke metode .plus () saja

Dalam 2 metode di atas, objek string baru dibuat karena string tidak dapat diubah. jika kita ingin mengubah string yang sudah ada, kita bisa menggunakan StringBuilder

StringBuilder str = StringBuilder("Hello").append("World")
Shradha Sangtani
sumber
1

yourString + = "newString"

Dengan cara ini Anda dapat menggabungkan string

Kanagalingam
sumber