この記事では、Kotlinのラムダ式の書き方と、その使いどころを紹介します。
ラムダ式とは
ラムダ式はfunキーワードを使わなくても関数を定義できる構文です。
またラムダ式は、変数に代入したり、関数の引数として渡すことができます。
ラムダ式の書き方
基本的なラムダ式の書き方
ラムダ式は基本的に次のように書きます。
val area: (Int, Int) -> Int = { w: Int, h: Int -> w * h }
=の右側が、ラムダ式です。wとhを引数に取り、その積を返すラムダ式です。
- 引数は->の左側に記述し、型が推測できる場合は型を省略可能
- ボディ(処理)は、->の右側に記述
- 戻り値は、Unit型ではないと推測されたら、ボディの最後の式が戻り値として返される
今回の場合、変数areaの関数型が書かれており、ラムダの引数の型は推測可能なので、引数の型は省略できます。引数の型を省略するとだいぶスッキリしますね。
val area: (Int, Int) -> Int = { w, h -> w * h }
引数がない場合
引数がない場合は、ボディ(処理)だけを記述します。
val sayHello = { println("Hello") }
sayHello() // Hello
引数が一つだけなら仮引数は省略可能
引数が一つだけの場合は、仮引数を省略して暗黙の仮引数itとして処理を記述できます。
まずは、仮引数を書くパターン
val introduceMySelf: (String) -> Unit = { name -> println("Hi, I'm ${name}.") }
introduceMySelf("Hoge") // Hi, I'm Hoge.
仮引数を省略して、itという暗黙の名前で書くパターン
val introduceMySelf: (String) -> Unit = { println("Hi, I'm ${it}.") }
introduceMySelf("Hoge") // Hi, I'm Hoge.
“Hoge”が変数itとして、処理が実行されていますね。
明示的にreturnする
明示的にreturnを書く場合はラベル付きreturnを使います。return@というやつです。
ラムダ式を渡してる関数名をreturn@の後ろに書きます。この場合filter関数にラムダ式を渡しているので、return@filterとしています。
return@filter isFilteredと書かずに、return isFilteredと書くと、main関数のreturnと認識され、意図しない動きになるのでラムダ式で明示的にreturnを書く場合はreturn@と書く必要があります。
fun main() {
var intArray: IntArray = intArrayOf(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
intArray = intArray.filter {
val isFiltered = it % 2 == 0
return@filter isFiltered
// return isFilteredと書くと、main関数のreturnになり、そこでmain関数を抜けることになる。
}.toIntArray()
}
ラベル付きreturnについては、この記事で解説しています。
ラムダ式の使いどころ
kotlinの経験が浅く、多くは思いつかないですが、いくつか使いどころを上げます。
リストのフィルター処理
listの要素をフィルタリングしたいときや、要素に何かしらの操作を行いたい時などに、その処理をラムダ式として渡します。
fun main() {
val intArray: IntArray = intArrayOf(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
intArray.filter { it % 2 == 0 }.forEach { println(it) } // 2 4 6 8 10
}
androidでコールバック関数を設定するとき
androidでコールバック関数を設定するときは、必ずと言っていいほどラムダ式を渡しています。
binding.someButton.setOnKeyListener { _, keyCode, keyEvent ->
// ...
}