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はラムダ式である。

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