Kotlinでは、文字列結合の方法が非常に豊富に用意されており、用途に応じて最適な手段を選ぶことが重要です。
単純な表示用文字列から、大量データを扱う処理、HTML・SQL・ログ生成まで、状況によってベストプラクティスは変わります。
本記事では、Kotlinにおける文字列結合の方法を網羅的に整理し、実務での正しい使い分けまで踏み込んで解説します。
+ 演算子による文字列結合(基本)
Kotlinでは、+ 演算子を使って文字列を結合できます。
val firstName = "Taro"
val lastName = "Yamada"
val fullName = firstName + " " + lastName
数値や他の型が混在していても、自動的に toString() が呼ばれます。
val age = 30
val message = "年齢は" + age + "歳です"
特徴
- Javaと同様の書き方が可能
- 短い文字列では可読性も悪くない
- Kotlin/JVMでは単一式の場合、内部的に最適化される
注意点
+ 演算子は再代入やループを伴う場合に問題になります。
var text = ""
for (i in 1..1000) {
text += i // 非推奨
}
このようなケースでは毎回新しい String が生成され、パフォーマンスとメモリ効率が悪化します。
文字列テンプレート(Kotlinで最も推奨される方法)
Kotlinの文字列結合で最も頻繁に使われるのが文字列テンプレートです。
val name = "Taro"
val age = 30
val message = "私の名前は$name、年齢は$age歳です"
式を埋め込む場合
val price = 1200
val text = "税込価格は${price * 1.1}円です"
特徴
- 非常に可読性が高い
+よりも意図が明確- UI表示・ログ・メッセージ生成で最優先
設計上の注意
${} の中には式を書けますが、可読性と保守性の観点から、複雑な処理や副作用のあるコードは避けるのが望ましいです。
// 推奨
val total = calcTotal()
"合計金額は$total 円です"
複数行文字列(トリプルクォート)
HTML、SQL、JSON、メール本文などでは、トリプルクォート文字列が有効です。
val html = """
<html>
<body>
<h1>Hello, $name</h1>
</body>
</html>
""".trimIndent()
ポイント
- 改行やレイアウトをそのまま保持
- 文字列テンプレートと併用可能
trimIndent()/trimMargin()でインデント調整
補足(実務視点)
SQLなどでは、実運用ではプレースホルダ(PreparedStatement)を使うのが基本ですが、文字列構造の説明としてはこの書き方が有効です。
StringBuilder による文字列結合(パフォーマンス重視)
大量の文字列を扱う場合、StringBuilder が適しています。
val sb = StringBuilder()
sb.append("Hello")
sb.append(" ")
sb.append("World")
val result = sb.toString()
ループ処理の例
val sb = StringBuilder()
for (i in 1..1000) {
sb.append("No.").append(i).append("\n")
}
特徴
- メモリ効率が高い
- 高速
- Javaと同じ
StringBuilderを利用
buildString {}(Kotlin推奨の高水準API)
Kotlin標準ライブラリが提供する、StringBuilder をラップした便利な関数です。
val result = buildString {
append("Hello")
append(" ")
append("World")
}
ループとの組み合わせ
val text = buildString {
for (i in 1..10) {
append("Item ").append(i).append("\n")
}
}
特徴
- 内部では
StringBuilderを使用 - 可読性と性能を両立
- Kotlinでは 最も推奨される大量結合手法
joinToString()(コレクション専用)
リストや配列を文字列に変換する場合は joinToString() が最適です。
val list = listOf("Apple", "Banana", "Orange")
val result = list.joinToString(", ")
カスタマイズ
val result = list.joinToString(
separator = " | ",
prefix = "[",
postfix = "]"
)
ラムダ利用
val users = listOf("Taro", "Hanako")
val text = users.joinToString("\n") { "User: $it" }
パフォーマンスと可読性の比較
| 方法 | 可読性 | パフォーマンス | 主な用途 |
|---|---|---|---|
+ | ○ | △ | 簡単な結合 |
| 文字列テンプレート | ◎ | ○ | UI・ログ |
StringBuilder | △ | ◎ | 大量処理 |
buildString | ◎ | ◎ | Kotlin推奨 |
joinToString | ◎◎ | ◎ | コレクション |
※ JVM上では + やテンプレートが最適化されるケースもありますが、ループ・再代入・大量データでは差が顕著になります。
実務での使い分け指針(結論)
UI・ログ・メッセージ
"ユーザー$nameがログインしました"
複数行テキスト
"""
Error occurred.
User: $name
""".trimIndent()
大量文字列生成
buildString {
data.forEach { append(it).append("\n") }
}
リスト表示
items.joinToString(", ")
まとめ
- 基本は文字列テンプレート
- 大量結合は
buildString - コレクションは
joinToString +は限定的に使う
Kotlinの文字列結合は「どれを使っても動く」反面、選び方次第で可読性・保守性・性能に大きな差が出ます。
以上、Kotlinの文字列結合についてでした。
最後までお読みいただき、ありがとうございました。










