Kotlin - So verketten Sie einen String korrekt

89

Eine sehr grundlegende Frage: Wie kann ein String in Kotlin richtig verkettet werden?

In Java würden Sie die concat()Methode verwenden, z

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

Die concat()Funktion ist für Kotlin jedoch nicht verfügbar. Soll ich das +Schild benutzen ?

Daniele
quelle

Antworten:

137

In Kotlin können Sie mithilfe von String-Interpolation / Vorlagen verketten :

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

Die Ausgabe wird sein: Hello World

Oder Sie können mit dem Operator +/ verketten plus():

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

print(c)

Die Ausgabe wird sein: HelloWorld

Oder Sie können mit dem verketten StringBuilder.

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

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

print(c)

Die Ausgabe wird sein: HelloWorld

Avijit Karmakar
quelle
6
Der Operator "+" wird in plus () übersetzt, sodass Sie entweder schreiben können a.plus(b)oder a + bderselbe Bytecode generiert wird
D3xter
21
Ich habe mir den Bytecode angesehen und die String-Interpolation verwendet StringBuilder intern
crgarridos
@crgarridos, würde dies bedeuten, dass für Kotlin die Verwendung der String-Interpolation zur Verkettung "Hello" + "Word"genauso performant ist wie die Verwendung von StringBuilder zum Anhängen an einen String someHelloStringBuilder.append("World")?
Adam Hurwitz
1
Die Zeichenfolgeninterpolation bezieht sich auf die Auflösung von Variablen innerhalb einer Literalzeichenfolge. also technisch ja.
Crgarridos
22

kotlin.Stringhat eine plusMethode:

a.plus(b)

Weitere Informationen finden Sie unter https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-string/plus.html .

Harald Gliebe
quelle
3
Der +Operator ist normal und ruft die übersetzte Operatorfunktion nicht auf plus ... dies ist nicht idiomatisch
Jayson Minard
warum denkst du das ?
schneidet
1
Vergessen Sie nicht , Ihr Ergebnis zu beeinflussen , wie ich es tat, wie a = a.plus(b)zum Beispiel
lorenzo
Der Kommentar von @lorenzo erklärt, warum diese Antwort den obigen Lösungen weniger vorzuziehen ist. Wenn die Verkettung von mehreren abhängig ist, sind if-Anweisungen plus()weniger praktisch als StringBuilderdie Append-Methode von a, d. H.
Panos Gr
9

Ja, Sie können mit einem +Zeichen verketten . Kotlin hat String-Vorlagen, daher ist es besser, sie wie folgt zu verwenden:

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

"$fn $ln" zur Verkettung.

Sie können sogar String.plus()Methode verwenden.

Tushar
quelle
Der +Operator ist normal und ruft die übersetzte Operatorfunktion nicht auf plus ... dies ist nicht idiomatisch
Jayson Minard
Könnten Sie bitte erklären, warum Sie der Meinung sind, dass die Plus-Version von + nicht idiomatisch ist?
schneidet
9

Ich stimme der oben akzeptierten Antwort zu, aber sie gilt nur für bekannte Zeichenfolgenwerte. Für dynamische Zeichenfolgenwerte ist hier mein Vorschlag.

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

Dies ist nützlich, um die Liste der Zeichenfolgen mit einem Trennzeichen zu verketten.

Rhusfer
quelle
5

Ähnlich wie bei @Rhusfer Antwort habe ich dies geschrieben. Wenn Sie eine Gruppe von EditTexts haben und deren Werte verketten möchten, können Sie schreiben:

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

Wenn Sie verketten möchten HashMap, verwenden Sie Folgendes :

map.entries.joinToString(separator = ", ")
// Result:
// id=123, name=John, surname=Smith
CoolMind
quelle
5

Versuchen Sie dies, ich denke, dies ist eine native Möglichkeit, Zeichenfolgen in Kotlin zu verketten:

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

println(result)

// you will see "ab" in console.
Licat Julius
quelle
1
es ist buildString {stattstringBuild {
arnonuem
@arnonuem Ich habe es behoben (wie Sie sich frei hätten fühlen sollen).
Ellen Spertus
2

Es gibt verschiedene Möglichkeiten, Zeichenfolgen in Kotlin zu verketten. Beispiel -

a = "Hello" , b= "World"
  1. Verwenden des Operators + a+b

  2. Mit plus()Operator

    a.plus(b)

Hinweis - + wird intern nur in die .plus () -Methode konvertiert

In den obigen 2 Methoden wird ein neues Zeichenfolgenobjekt erstellt, da Zeichenfolgen unveränderlich sind. Wenn wir die vorhandene Zeichenfolge ändern möchten, können wir StringBuilder verwenden

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

yourString + = "newString"

Auf diese Weise können Sie eine Zeichenfolge verketten

Kanagalingam
quelle