Kotlin - วิธีการต่อสตริงอย่างถูกต้อง


90

คำถามพื้นฐานมากวิธีที่ถูกต้องในการเชื่อมสตริงใน Kotlin คืออะไร?

ใน Java คุณจะใช้concat()วิธีการเช่น

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

concat()ฟังก์ชั่นไม่สามารถใช้ได้สำหรับ Kotlin แม้ว่า ฉันควรใช้+เครื่องหมาย?

คำตอบ:


138

เทมเพลตสตริง / การแก้ไข

ใน Kotlin คุณสามารถเชื่อมต่อโดยใช้การแก้ไขสตริง / แม่แบบ :

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

ผลลัพธ์จะเป็น: Hello World

  • ใช้คอมไพเลอร์StringBuilderสำหรับแม่แบบ Stringซึ่งเป็นวิธีที่มีประสิทธิภาพมากที่สุดในแง่ของหน่วยความจำเพราะ+/ สร้างวัตถุใหม่ Stringplus()

หรือคุณสามารถเชื่อมต่อโดยใช้ไฟล์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

  • สิ่งนี้จะสร้างวัตถุ String ใหม่

7
โอเปอเรเตอร์ "+" ถูกแปลเป็นบวก () ดังนั้นคุณจึงสามารถเขียนa.plus(b)หรือa + bสร้างรหัส bytecode เดียวกันได้
D3xter

21
ฉันมองเข้าไปใน bytecode และการแก้ไขสตริงโดยใช้ StringBuilder ภายใน
crgarridos

@crgarridos หมายความว่าสำหรับ Kotlin ที่ใช้การแก้ไขสตริงสำหรับการเรียงต่อกัน"Hello" + "Word"นั้นมีประสิทธิภาพเช่นเดียวกับการใช้ StringBuilder เพื่อต่อท้ายสตริงsomeHelloStringBuilder.append("World")ใช่หรือไม่
Adam Hurwitz

1
การแก้ไขสตริงหมายถึงความละเอียดของตัวแปรภายในสตริงตามตัวอักษร ใช่แล้วในทางเทคนิค
crgarridos

23

kotlin.Stringมีplusวิธีการ:

a.plus(b)

ดูรายละเอียดhttps://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-string/plus.html


3
ตัว+ดำเนินการเป็นเรื่องปกติไม่เรียกใช้ฟังก์ชันตัวดำเนินการที่แปลแล้วplus ... นี่ไม่ใช่สำนวน
Jayson Minard

ทำไมถึงคิดอย่างนั้น ?
เกิด

1
อย่าลืมที่จะส่งผลกระทบต่อผลของคุณเหมือนผมเหมือนa = a.plus(b)เช่น
Lorenzo

ความคิดเห็นของ @lorenzo อธิบายว่าเหตุใดคำตอบนี้จึงไม่เป็นที่ต้องการของโซลูชันข้างต้น เมื่อการเรียงต่อกันขึ้นอยู่กับหลาย ๆ คำสั่งถ้าplus()ใช้งานได้จริงน้อยกว่าStringBuilderวิธีผนวกเช่น
Panos Gr

10

ฉันเห็นด้วยกับคำตอบที่ยอมรับข้างต้น แต่ใช้ได้ดีสำหรับค่าสตริงที่ทราบเท่านั้น สำหรับค่าสตริงแบบไดนามิกนี่คือคำแนะนำของฉัน

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

สิ่งนี้มีประโยชน์สำหรับการต่อรายการสตริงที่มีตัวคั่น


9

ใช่คุณสามารถเชื่อมต่อกันโดยใช้+เครื่องหมาย Kotlin มีเทมเพลตสตริงดังนั้นจึงควรใช้เทมเพลตเหล่านี้เช่น:

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

"$fn $ln" สำหรับการเชื่อมต่อ

คุณสามารถใช้String.plus()วิธีการ


ตัว+ดำเนินการเป็นเรื่องปกติไม่เรียกใช้ฟังก์ชันตัวดำเนินการที่แปลแล้วplus ... นี่ไม่ใช่สำนวน
Jayson Minard

คุณช่วยอธิบายได้ไหมว่าทำไมคุณถึงคิดว่ารุ่นบวกของ + ไม่ใช่สำนวน?
เกิด

5

ลองทำดูฉันคิดว่านี่เป็นวิธีการต่อสตริงใน Kotlin:

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

println(result)

// you will see "ab" in console.

1
buildString {แทนที่จะเป็นstringBuild {
arnonuem

@arnonuem ฉันได้รับการแก้ไขแล้ว (อย่างที่คุณควรรู้สึกอิสระที่จะทำ)
Ellen Spertus

5

คล้ายกับคำตอบของ @Rhusfer ที่ฉันเขียนสิ่งนี้ ในกรณีที่คุณมีกลุ่มEditTexts และต้องการเชื่อมค่าเข้าด้วยกันคุณสามารถเขียน:

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

2

มีหลายวิธีในการต่อสตริงใน kotlin ตัวอย่าง -

a = "Hello" , b= "World"
  1. ใช้ + ตัวดำเนินการ a+b

  2. ใช้plus()ตัวดำเนินการ

    a.plus(b)

หมายเหตุ - + ถูกแปลงภายในเป็นวิธีการ. plus () เท่านั้น

ใน 2 วิธีการข้างต้นอ็อบเจ็กต์สตริงใหม่จะถูกสร้างขึ้นเนื่องจากสตริงไม่เปลี่ยนรูป หากเราต้องการแก้ไขสตริงที่มีอยู่เราสามารถใช้ StringBuilder

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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.