user icon

Kotlin の便利な機能 3 選

主に Android の界隈で最近にわかに取り上げられている Kotlin ですが、しばらく使ってみて便利だと感じている機能を 3 つ紹介します。

ラムダ式(SAM 変換)

私が Kotlin を試すきっかけになった機能です。Kotlin にはラムダ式があり、イベントリスナーのような Java でメソッドをひとつ持つインターフェース(Single Abstract Method と表現したりする)を簡潔に記載することが出来ます。

textView.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        Toast.makeText(context,
                textView.getText(),
                Toast.LENGTH_SHORT).show();
    }
});

こういうのが

textView.setOnClickListener { view ->
    Toast.makeText(this,
            textView.text,
            Toast.LENGTH_SHORT).show()
}

こういう感じでシンプルに書けます。こちらの記事など分かり易くて参考になりました。

高階関数、リスト処理

Kotlin 使い初めの頃は Java の感覚でリスト処理を拡張 for 文でやっていましたが、Kotlin は高階関数をサポートしており、標準ライブラリにはリスト処理の関数もあります。ラムダ式が使える時点で気付くべきだった…。

arrayListOf(1, 2, 3).map { i -> i * 2 }

arrayListOf(1, 2, 3).map { it * 2 }

fun twice(i: Int): Int { return i * 2}
arrayListOf(1, 2, 3).map { ::twice }

// いずれも [2, 4, 6] の ArrayList を返す

ラムダ式の引数が 1 つの場合は、2 つ目の例のように暗黙に it という名前で引数を定義してくれます。
また 3 つ目の例のように関数参照を渡すことも出来ます。

関数脳が弱いので高階関数はまだまだ使い熟せてなく、ひとまずリスト処理からでも初めて勉強していく所存です。

6.2 リスト – プログラミング言語Kotlin 解説
Higher-Order Functions and Lambdas

データクラス

Kotlin にはデータクラスを簡単に定義出来る data 修飾子があります。lombok の @data アノテーションに近い感覚ですね。

data class Data(
        var nickname: String,
        val status: String = "ok",
        val code: String,
)

val data1 = Data("foo", "ok", "code1")
val data2 = Data(nickname = "bar", code = "code2")

クラス本体の記述は省略可能なのでこれだけです。データクラスには equals()/hashCode()/toString()/copy() が自動的に定義されます。
データクラスの機能では無いですが、Kotlin はデフォルト引数や名前付き引数もサポートしているので初期化時のパラメータも省略出来ます。

所感

Ruby のような言語だと高階関数やラムダ(ブロック)はよくある機能ですが、これを Java が必要なシチュエーションでも使っていけるのはかなりありがたいです。Kotlin は Java との親和性を意識している為、既存の Java ライブラリのような資産を苦無く使える場合が多いのも強みですね。

他にも Java コードで書かれたクラスの getter/setter をプロパティよろしく扱うことが出来たり、どんどん使い易くなっています。割と Android 目線に寄った内容になってしまいましたが、もっと便利な機能はたくさんあるはずなので是非リファレンスも見てみて下さい。フル PDF やオンライン実行環境も置いてあります。
1.0 のリリースも近付いてきているようでこれからも目が離せません。


この記事は業務時間のうち 20% の捗らない時間を利用して書かれました。進捗ダメです…。

Facebooktwitterlinkedintumblrmail
名前
E-mail
URL
コメント

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)