Kotlin - Как правильно объединить строку


90

Очень простой вопрос, как правильно объединить String в 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

Или вы можете объединить с помощью оператора +/ 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, будет ли это означать, что для 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

Почему ты так думаешь ?
разрезает

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

Комментарий @lorenzo объясняет, почему этот ответ менее предпочтителен по сравнению с решениями выше. Когда конкатенация зависит от нескольких операторов if, plus()менее практична, чем StringBuilderметод добавления, т.е.
Panos Gr,

9

Да, вы можете объединить с помощью +знака. В Kotlin есть строковые шаблоны, поэтому лучше использовать их как:

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

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

Вы даже можете использовать String.plus()метод.


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

Не могли бы вы объяснить, почему вы думаете, что плюс-версия + не является идиоматической?
разрезает

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 Я исправил это (как вы и должны были сделать).
Эллен Спертус

2

Существуют различные способы объединения строк в примере котлина -

a = "Hello" , b= "World"
  1. Использование оператора + a+b

  2. Использование plus()оператора

    a.plus(b)

Примечание - + внутренне преобразуется только в метод .plus ()

В двух вышеуказанных методах создается новый строковый объект, поскольку строки неизменяемы. если мы хотим изменить существующую строку, мы можем использовать StringBuilder

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.