Котлін - Як правильно об’єднати рядок


90

Дуже елементарне запитання: який правильний спосіб об’єднати рядок у Котліні?

У 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

Або ви можете об'єднати за допомогою +plus() оператора / :

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

print(c)

Результатом буде: HelloWorld

Або ви можете об'єднати за допомогою StringBuilder .

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

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

print(c)

Результатом буде: HelloWorld


6
оператор «+» перекладається в плюс (), так що ви можете або написати a.plus(b)або a + bгенерується і той же байт - код
D3xter

21
Я вивчив байт-код і інтерполяція рядків використовує StringBuilder внутрішньо
crgarridos

@crgarridos, Чи означає це, що для Kotlin використання інтерполяції рядків для конкатенації "Hello" + "Word"є настільки ж продуктивним, як використання StringBuilder для додавання до рядка someHelloStringBuilder.append("World"),?
Адам Гурвіц,

1
інтерполяція рядків відноситься до роздільної здатності змінних всередині буквального рядка. так технічно так.
crgarridos

22

kotlin.Stringмає plusметод:

a.plus(b)

Детальніше див. Https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-string/plus.html .


3
+Оператор нормально, не викликаючи перекладені функції оператора plus ... це не ідіоматичне
Джейсон Minard

чому ти так думаєш ?
incises

1
Не забудьте вплинути на свій результат, як я, як, a = a.plus(b)наприклад,
лоренцо

Коментар @lorenzo пояснює, чому ця відповідь менш краща порівняно з наведеними вище рішеннями. При об'єднанні залежить від множини, якщо оператори plus()менш практичні, ніж StringBuilderметод додавання ', тобто.
Panos Gr

9

Так, ви можете об’єднатись за допомогою +знака. Kotlin має шаблони рядків, тому їх краще використовувати, як:

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

"$fn $ln" для конкатенації.

Ви навіть можете використовувати String.plus()метод.


+Оператор нормально, не викликаючи перекладені функції оператора plus ... це не ідіоматичне
Джейсон Minard

Не могли б ви пояснити, чому, на вашу думку, плюсова версія + не є ідіоматичною?
incises

9

Я погоджуюсь із прийнятою вище відповіддю, але вона корисна лише для відомих рядкових значень. Для динамічних значень рядків ось моя пропозиція.

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

Це корисно для об'єднання списку рядків із роздільником.


5

Подібно до відповіді @Rhusfer, я писав це. Якщо у вас є група EditTexts і ви хочете об'єднати їх значення, ви можете написати:

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

Якщо ви хочете об’єднати HashMap, скористайтеся цим:

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

5

Спробуйте це, я думаю, що це рідний спосіб об'єднати рядки в Kotlin:

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

println(result)

// you will see "ab" in console.

1
це buildString {замістьstringBuild {
arnonuem

@arnonuem Я це виправив (як ти мав би почуватись вільно).
Еллен Спертус

2

Існують різні способи об’єднання рядків у прикладі kotlin -

a = "Hello" , b= "World"
  1. За допомогою оператора + a+b

  2. За допомогою plus()оператора

    a.plus(b)

Примітка - + внутрішньо перетворюється лише на метод .plus ()

У вищезазначених 2 методах створюється новий об’єкт рядка, оскільки рядки є незмінними. якщо ми хочемо змінити існуючий рядок, ми можемо використовувати StringBuilder

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.