121 votes

Kotlin - Comment concaténer correctement une chaîne de caractères ?

Une question très basique, quelle est la bonne façon de concaténer une chaîne en Kotlin ?

En Java, vous utiliseriez la fonction concat() méthode, par exemple

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

Le site concat() n'est pas disponible pour Kotlin. Dois-je utiliser la fonction + signe ?

191voto

Avijit Karmakar Points 3827

Modèles de chaînes/Interpolation

En Kotlin, vous pouvez concaténer en utilisant Interpolation de chaînes de caractères/templates :

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

La sortie sera : Hello World

Ou vous pouvez concaténer en utilisant la fonction StringBuilder explicitement.

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

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

print(c)

La sortie sera : HelloWorld

Nouvel objet String

Ou vous pouvez concaténer en utilisant la fonction + / plus() opérateur :

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

print(c)

La sortie sera : HelloWorld

  • Cela va créer un nouvel objet String.

9 votes

L'opérateur "+" est traduit en plus(), donc vous pouvez soit écrire a.plus(b) ou a + b et le même bytecode est généré

25 votes

J'ai regardé dans le bytecode et l'interpolation des chaînes utilise StringBuilder en interne.

1 votes

@crgarridos, Cela signifie-t-il que pour Kotlin, l'utilisation de l'interpolation de chaîne pour la concaténation "Hello" + "Word" est tout aussi performant que l'utilisation de StringBuilder pour ajouter à une chaîne, someHelloStringBuilder.append("World") ?

28voto

Harald Points 4021

kotlin.String a un plus méthode :

a.plus(b)

Voir https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-string/plus.html pour les détails.

3 votes

Le site + est normal, il ne s'agit pas d'appeler la fonction opérateur traduite plus ... ce n'est pas idiomatique

0 votes

Pourquoi pensez-vous cela ?

3 votes

N'oubliez pas d'affecter votre résultat comme je l'ai fait, comme a = a.plus(b) par exemple

13voto

Rhusfer Points 76

Je suis d'accord avec la réponse acceptée ci-dessus, mais elle n'est bonne que pour les valeurs de chaîne connues. Pour les valeurs de chaîne dynamiques, voici ma suggestion.

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

Ceci est utile pour concaténer une liste de chaînes de caractères avec un séparateur.

10voto

Tushar Gupta Points 5137

Oui, vous pouvez concaténer en utilisant un + signe. Kotlin dispose de modèles de chaînes, il est donc préférable de les utiliser comme :

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

"$fn $ln" pour la concaténation.

Vous pouvez même utiliser String.plus() méthode.

0 votes

Le site + est normal, il ne s'agit pas d'appeler la fonction de l'opérateur traduit plus ... ce n'est pas idiomatique

0 votes

Pouvez-vous expliquer pourquoi vous pensez que la version plus de + n'est pas idiomatique ?

6voto

CoolMind Points 11

Similaire à Réponse de @Rhusfer J'ai écrit ceci. Au cas où vous auriez un groupe de EditText et que vous voulez concaténer leurs valeurs, vous pouvez écrire :

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

Si vous voulez concaténer Map utilisez ceci :

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

Pour concaténer Bundle , utiliser

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

Il classe les clés par ordre alphabétique.

Exemple :

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X