Kotlin - Jak poprawnie połączyć ciąg

89

Bardzo podstawowe pytanie, jaki jest właściwy sposób konkatenacji łańcucha w Kotlinie?

W Javie użyłbyś concat()metody, np

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

Ta concat()funkcja nie jest jednak dostępna dla Kotlina. Czy powinienem użyć +znaku?

Daniele
źródło

Odpowiedzi:

137

W Kotlinie możesz łączyć za pomocą interpolacji ciągów / szablonów :

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

Wynik będzie: Hello World

Lub możesz połączyć za pomocą operatora +/ plus():

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

print(c)

Wynik będzie: HelloWorld

Lub możesz połączyć za pomocą StringBuilder.

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

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

print(c)

Wynik będzie: HelloWorld

Avijit Karmakar
źródło
6
operator "+" jest tłumaczony na plus (), więc możesz pisać a.plus(b)albo a + bi generowany jest ten sam kod bajtowy
D3xter
21
Zajrzałem
@crgarridos, oznaczałoby to, że za pomocą interpolacji Kotlin ciąg dla konkatenacji "Hello" + "Word"jest tak samo wydajnych, jak przy użyciu StringBuilder, aby dołączyć do łańcucha, someHelloStringBuilder.append("World")?
Adam Hurwitz
1
interpolacja ciągów odnosi się do rozdzielczości zmiennych wewnątrz literału. więc technicznie tak.
crgarridos
22

kotlin.Stringma plusmetodę:

a.plus(b)

Szczegółowe informacje można znaleźć pod adresem https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-string/plus.html .

Harald Gliebe
źródło
3
+Operator jest normalne, nie wywołując tłumaczone funkcję operatora plus ... to nie jest idiomatyczne
Jayson Minard
dlaczego tak myślisz ?
nacina
1
Nie zapomnij wpłynąć na swój wynik tak jak ja, a = a.plus(b)na przykład
lorenzo
Komentarz @lorenzo wyjaśnia, dlaczego ta odpowiedź jest mniej korzystna niż powyższe rozwiązania. Gdy konkatenacja jest zależna od wielu, jeśli instrukcje plus()są mniej praktyczne niż StringBuildermetoda dołączania, tj.
Panos Gr
9

Tak, możesz łączyć za pomocą +znaku. Kotlin ma szablony ciągów, więc lepiej ich używać jak:

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

"$fn $ln" do konkatenacji.

Możesz nawet użyć String.plus()metody.

Tushar
źródło
+Operator jest normalne, nie wywołując tłumaczone funkcję operatora plus ... to nie jest idiomatyczne
Jayson Minard
Czy mógłbyś wyjaśnić, dlaczego uważasz, że wersja plus + nie jest idiomatyczna?
nacięcia
9

Zgadzam się z zaakceptowaną odpowiedzią powyżej, ale jest ona dobra tylko dla znanych wartości ciągów. Oto moja propozycja dla dynamicznych wartości ciągów.

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

Jest to przydatne do łączenia listy ciągów za pomocą separatora.

Rhusfer
źródło
5

Podobnie jak @Rhusfer odpowiedz , napisałem to. W przypadku, gdy masz grupę EditTexts i chcesz połączyć ich wartości, możesz napisać:

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

Jeśli chcesz połączyć HashMap, użyj tego:

map.entries.joinToString(separator = ", ")
// Result:
// id=123, name=John, surname=Smith
CoolMind
źródło
5

Spróbuj tego, myślę, że jest to natywny sposób łączenia ciągów w Kotlinie:

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

println(result)

// you will see "ab" in console.
Licat Julius
źródło
1
jest buildString {zamiaststringBuild {
arnonuem
@arnonuem Poprawiłem to (co powinieneś zrobić).
Ellen Spertus
2

Istnieją różne sposoby łączenia łańcuchów w kotlin Przykład -

a = "Hello" , b= "World"
  1. Korzystanie z operatora + a+b

  2. Korzystanie plus()operator

    a.plus(b)

Uwaga - + jest wewnętrznie konwertowane tylko do metody .plus ()

W powyższych 2 metodach nowy obiekt typu string jest tworzony, ponieważ ciągi znaków są niezmienne. jeśli chcemy zmodyfikować istniejący ciąg, możemy użyć StringBuilder

StringBuilder str = StringBuilder("Hello").append("World")
Shradha Sangtani
źródło
1

yourString + = "newString"

W ten sposób możesz połączyć ciąg

Kanagalingam
źródło