ラムダ式とクラスによる関数型の実装

ラムダ式の正体は関数型を実装したクラスである。

ラムダ式

val f: (Int) -> (Int) -> Unit = { i: Int ->
    { j: Int ->
        println(i + j)
    }
}

f(1)(5) // 6

f.invoke(1).invoke(5) // 6 
  • invoke()メソッドを通じて関数をコールすることができる

クラスによる関数型の実装

関数型を実装することで、ラムダ式として呼び出すことが可能となる。

class Triple: (Int) -> (Int) -> (Int) -> Int {
    override operator fun invoke(x: Int): (Int) -> (Int) -> Int {
        return fun(y: Int): (Int) -> Int {
            return fun(z: Int): Int {
                return x * y * z
            }
        }
    }
}


val triple = Triple()

println(triple(1)(2)(3))
println(triple.invoke(1).invoke(2).invoke(3))
  • invoke()メソッドをオーバーライドする

参照

kotlin - Custom Class Implement a Function Type - Stack Overflow

関連

関数型インターフェース - あるマのメモ書き

匿名クラスについてのまとめ - あるマのメモ書き