Kotlin-文字列を正しく連結する方法


90

非常に基本的な質問ですが、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

または、StringBuilder明示的に使用して連結することもできます。

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

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

print(c)

出力は次のようになります。 HelloWorld

新しい文字列オブジェクト

または、+/plus()演算子を使用して連結できます。

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

print(c)

出力は次のようになります。 HelloWorld

  • これにより、新しいStringオブジェクトが作成されます。

7
演算子「+」はplus()に変換されるため、a.plus(b)またはa + bを書き込むことができ、同じバイトコードが生成されます
D3xter 2017年

21
私はバイトコードに見て、文字列の補間は、内部でのStringBuilderを使用しています
crgarridos

@crgarridos、これは、連結に文字列補間を使用するKotlinの場合、"Hello" + "Word"StringBuilderを使用して文字列に追加するのと同じくらいパフォーマンスが高いことを意味しますsomeHelloStringBuilder.append("World")か?
AdamHurwitz20年

1
文字列補間とは、リテラル文字列内の変数の解決を指します。技術的にはそうです。
crgarridos

23

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'sappendメソッドよりも実用的ではありません。
PanosGr20年

10

上記の受け入れられた答えに同意しますが、それは既知の文字列値にのみ適しています。動的な文字列値については、ここに私の提案があります。

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

これは、文字列のリストを区切り文字で連結する場合に役立ちます。


9

はい、+記号を使用して連結できます。Kotlinには文字列テンプレートがあるため、次のように使用することをお勧めします。

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

"$fn $ln" 連結用。

String.plus()メソッドを使用することもできます。


+オペレータが正常で、翻訳された演算子関数を呼び出していないplus ...これは慣用的ではありません
ジェイソンMinard

+のプラスバージョンが慣用的ではないと思う理由を説明してください。
切開

5

これを試してください。これは、Kotlinで文字列を連結するためのネイティブな方法だと思います。

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

println(result)

// you will see "ab" in console.

1
それはbuildString {代わりにstringBuild {
arnonuem

@arnonuem私はそれを修正しました(あなたが自由に感じるべきだったので)。
エレンスペルトゥス

5

@Rhusferの回答と同様に、私はこれを書きました。EditTextsのグループがあり、それらの値を連結する場合は、次のように記述できます。

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

連結する場合はMap、次を使用します。

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

連結するBundle使用

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

キーをアルファベット順に並べ替えます。

例:

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

2

kotlinの例で文字列を連結するさまざまな方法があります-

a = "Hello" , b= "World"
  1. +演算子の使用 a+b

  2. plus()演算子の使用

    a.plus(b)

注-+は内部で.plus()メソッドにのみ変換されます

上記の2つのメソッドでは、文字列は不変であるため、新しい文字列オブジェクトが作成されます。既存の文字列を変更する場合は、StringBuilderを使用できます

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.