Kotlinのラムダ式
概要
ラムダ式とは、匿名関数をより簡潔に記述したものである。
格段にコードの記述量が減るが、その分情報量も減っていることに注意する。
実装
変数
以下に簡単な例を示す。
{}で囲む。
{a: Int, b: Int -> a + b }この例では二つのInt型のパラメータを受け取り、その和を返すものである。
これを使用するには以下のように記述する。
var sum = {a: Int, b: Int -> a + b }
println(sum(1, 2))//3引数
ラムダ式を引数にとる関数も定義することができる。
fun delegate(fn: (Int, Int) -> Int, n1: Int, n2: Int){
println(fn(n1, n2))
}
fun main(){
var sum = {a: Int, b: Int -> a + b }
var sub = {a: Int, b: Int -> a - b }
var times = {a: Int, b: Int -> a * b }
var div = {a: Int, b: Int -> a / b }
delegate(sum, 4, 4)//8
delegate(sub, 4, 4)//0
delegate(times, 4, 4)//16
delegate(div, 4, 4)//1
}この例ではあまり実用的ではないが、例えばutilsフォルダなどで様々な関数を反復したい場合などに便利である。
以下に例を示す。
fun repeat(times: Int, action: (Unit) -> Unit) {
for (index in 0 until times) {
action(index)
}
}この例ではtimes変数分だけ反復し、actionを実行するものである。
もし使用するならば、
fun repeat(times: Int, action: () -> Unit) {
for (index in 0 until times) {
action()
}
}
fun main(){
var mPrint = { println("Hello World!") }
repeat(10, mPrint)
}といったように引数としてラムダ式を渡すだけである。
スコープ
ラムダ式のスコープ範囲は、そのラムダ式が存在するスコープと同様である。
つまり、ラムダ式の外のmutableな変数を変更できるということである。
fun main(){
var a = 10
var lambda = { i: Int -> a += i }
lambda(8)
}このようにラムダ式には外部のスコープにアクセスできる。
ただしラムダ式内で定義した変数はラムダ式内でのスコープとなる。
他の例
例えばforEachはラムダ式である。

forEach - Kotlin Programming Language
val fruits = ["apple", "banana", "grape"]
fruits.forEach{ it ->
println(it)
}