主に Android の界隈で最近にわかに取り上げられている Kotlin ですが、しばらく使ってみて便利だと感じている機能を 3 つ紹介します。
私が 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% の捗らない時間を利用して書かれました。進捗ダメです…。