覚えたら書く

IT関係のデベロッパとして日々覚えたことを書き残したいです。twitter: @yyoshikaw

Kotlin - 文字列テンプレート

「Kotlinイン・アクション」 を読みながら相変わらず写経してます。(Javaと比較しながら)

Kotlinイン・アクション

Kotlinイン・アクション

  • 作者: Dmitry Jemerov,Svetlana Isakova,長澤太郎,藤原聖,山本純平,yy_yank
  • 出版社/メーカー: マイナビ出版
  • 発売日: 2017/10/31
  • メディア: 単行本(ソフトカバー)
  • この商品を含むブログ (2件) を見る


簡単な文字列フォーマット

Kotlin では、文字列テンプレート(string template)と呼ばれる機能が導入されています。
Rubyなどにも導入されているものとかなり似ているものだと思います。

変数名の前に $ を置くことで、文字列リテラルの中でローカル変数を参照することが可能となっています。

例えば、引数が負数かどうかチェックして、負数であれば IllegalArgumentException をスローし、その例外の中に引数の値も情報として含めるものとします。
そのようなメソッドを作成する場合、Javaでは以下のようなコードになります。

public class StringTemplate {

    public static void main(String[] args) {
        validation(-1);
    }

    private static void validation(int value) {
        if (value < 0) {
            throw new IllegalArgumentException("parameter is invalid. [parameter: " + value + "]");
        }
    }
}

"parameter is invalid. [parameter: " + value + "]" というような文字列連結を記述する必要が出てきます。


Kotlinであれば、文字列テンプレートを使って同様の関数を以下のように記述できます。
$vale の部分が文字列テンプレートの利用箇所です。

fun main() {
    validation(-123)
}

fun validation(value: Int) {
    if (value < 0) {
        throw IllegalArgumentException("parameter is invalid. [parameter: $value]")
    }
}

Kotlinのコードの実行結果は以下のようになります。正しく例外がスローされ、引数の値も情報として含まれていることがわかります。

Exception in thread "main" java.lang.IllegalArgumentException: parameter is invalid. [parameter: -123]
    at net.yyuki.sandbox.string.StringTemplateKt.validation(StringTemplate.kt:10)
    at net.yyuki.sandbox.string.StringTemplateKt.main(StringTemplate.kt:5)
    at net.yyuki.sandbox.string.StringTemplateKt.main(StringTemplate.kt)


文字列連結で値を埋め込む手段を記述することになってしまいますが、文字列テンプレートを利用することでやりたいことを素直に表現するわかりやすいコードになると思います


式を埋め込む

この記法は単純な変数への参照だけではなく、複雑な式でも利用可能です。式を利用する場合は、その式の周りを波括弧で囲みます。

これにより、配列の1要素を埋め込むというような記述もできます。
たとえば、配列の先頭要素が空文字列でなければNGという(謎の)チェックをする関数を作成します。値が空でなければ例外をスローして、その要素の値を例外に情報として埋め込みます。

コードは以下のようになります。${array[0]} の部分が文字列テンプレートの利用箇所です。

fun main() {
    val arrayVale = arrayOf("sample1", "sample2", "sample3")

    validation(arrayVale)
}

fun validation(array: Array<String>) {
    if (array[0].isNotEmpty()) {
        throw IllegalArgumentException("The first element of the array is not empty. [first element: ${array[0]}]")
    }
}

実行結果は以下の通りです

Exception in thread "main" java.lang.IllegalArgumentException: The first element of the array is not empty. [first element: sample1]
    at net.yyuki.sandbox.string.StringTemplateKt.validation(StringTemplate.kt:13)
    at net.yyuki.sandbox.string.StringTemplateKt.main(StringTemplate.kt:7)
    at net.yyuki.sandbox.string.StringTemplateKt.main(StringTemplate.kt)


例えば、if 式を埋め込むことも可能です。

fun main() {
    val a = 100
    val b = 200

    println("As a result of comparison, the big value is ${if (a > b) a else b}")
}

実行結果は以下の通りです

As a result of comparison, the big value is 200


まとめ

Javaで文字列連結で書いていたような場面で、Kotlinの文字列テンプレートを利用するとコードの見通しがよくなります。