Kotlin - como concatenar corretamente uma string

90

Uma questão muito básica, qual é a maneira certa de concatenar uma String no Kotlin?

Em Java, você usaria o concat()método, por exemplo

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

A concat()função não está disponível para Kotlin. Devo usar o +sinal?

Daniele
fonte

Respostas:

139

Modelos de string / interpolação

No Kotlin, você pode concatenar usando modelos / interpolação de string :

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

O resultado será: Hello World

Ou você pode concatenar usando StringBuilderexplicitamente.

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

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

print(c)

O resultado será: HelloWorld

Novo objeto String

Ou você pode concatenar usando o operador +/ plus():

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

print(c)

O resultado será: HelloWorld

  • Isso criará um novo objeto String.
Avijit Karmakar
fonte
7
o operador "+" é traduzido em mais (), então você pode escrever a.plus(b)ou a + be o mesmo bytecode é gerado
D3xter
21
Eu olhei para o bytecode e a interpolação de string usa StringBuilder internamente
crgarridos
@crgarridos, isso significaria que, para Kotlin, usar a interpolação de string para concatenação "Hello" + "Word"é tão eficiente quanto usar StringBuilder para anexar a uma string someHelloStringBuilder.append("World")?
Adam Hurwitz
1
a interpolação de string refere-se à resolução de variáveis ​​dentro de uma string literal. então tecnicamente sim.
crgarridos de
23

kotlin.Stringtem um plusmétodo:

a.plus(b)

Consulte https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-string/plus.html para obter detalhes.

Harald Gliebe
fonte
3
O +operador é normal, não chama a função do operador traduzido plus ... isso não é idiomático
Jayson Minard
porque você acha isso ?
incisões em
1
Não se esqueça de afetar seu resultado como eu fiz, a = a.plus(b)por exemplo
lorenzo
O comentário de @lorenzo explica por que essa resposta é menos preferível do que as soluções acima. Quando a concatenação depende de várias instruções if, plus()é menos prático do que StringBuildero método append de um ie.
Panos Gr de
10

Eu concordo com a resposta aceita acima, mas só é válida para valores de string conhecidos. Para valores de string dinâmicos, aqui está minha sugestão.

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

Isso é útil para concatenar lista de strings com separador.

Rhusfer
fonte
9

Sim, você pode concatenar usando um +sinal. Kotlin tem modelos de string, então é melhor usá-los como:

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

"$fn $ln" para concatenação.

Você pode até usar o String.plus()método.

Tushar
fonte
O +operador é normal, não chama a função do operador traduzido plus ... isso não é idiomático
Jayson Minard
Você poderia explicar por que você acha que a versão positiva de + não é idiomática?
incisões em
5

Tente isto, acho que esta é uma maneira nativa de concatenar strings no Kotlin:

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

println(result)

// you will see "ab" in console.
Licat Julius
fonte
1
é em buildString {vez destringBuild {
arnonuem
@arnonuem Eu consertei (como você deveria se sentir à vontade para fazer).
Ellen Spertus
5

Escrevi isso de forma semelhante à resposta @Rhusfer . Caso você tenha um grupo de se EditTextdeseja concatenar seus valores, você pode escrever:

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

Se você deseja concatenar Map, use isto:

map.entries.joinToString(separator = ", ")

Para concatenar Bundle, use

bundle.keySet().joinToString(", ") { key -> "$key=${bundle[key]}" }

Ele classifica as chaves em ordem alfabética.

Exemplo:

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
CoolMind
fonte
2

Existem várias maneiras de concatenar strings no exemplo kotlin -

a = "Hello" , b= "World"
  1. Usando o operador + a+b

  2. Usando o plus()operador

    a.plus(b)

Observação - + é convertido internamente apenas para o método .plus ()

Nos dois métodos acima, um novo objeto string é criado, pois as strings são imutáveis. se quisermos modificar a string existente, podemos usar StringBuilder

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

yourString + = "newString"

Desta forma, você pode concatenar uma string

Kanagalingam
fonte