Kotlin第一級関数(First-class functions)
概要
最近作られた、関数型プログラミングをサポートする言語の多くは、第一級関数(First-class functions)をサポートしている。Java 8も最近、第一級関数をサポートし始めた。
第一級関数とは何か。プログラミング言語で関数を値として扱えることをいう。つまり、第一級関数とはオブジェクトとして扱われる関数を意味する。
第一級関数には次のような特徴がある。
- 変数に代入(assignment)できる。
- 他の関数(またはメソッド)へ引数(parameter)として渡せる。
- 他の関数(またはメソッド)の戻り値(return value)として渡せる。
Kotlinでも、関数を他の値と同じように変数へ代入したり、関数の引数として渡したり、戻り値として受け取ったりできる。このように他の値と同じ形になった関数を、便宜上、関数オブジェクト(function object)と呼ぶ。
変数に代入(assignment)できる
次の例では、関数を変数に代入している。
fun main() {
val hello: () -> String = { "Hello world!" }
println(hello())
}
Output:
Hello world!
上の例では、変数helloに"Hello world!"文字列を返す関数を代入している。
他の関数(またはメソッド)へ引数(parameter)として渡せる
次の例では、関数を引数として渡している。
fun printlnFunc(func: () -> String) {
println("${func()}")
}
fun main() {
val hello: () -> String = { "Hello world!" }
printlnFunc(hello)
}
Output:
Hello world!
上の例で、printlnFunc()関数は引数として文字列を返す関数を受け取っている。main()を見ると、printlnFunc()関数にhello関数変数を渡している。
他の関数(またはメソッド)の戻り値(return value)として渡せる
次の例では、関数を返している。
fun getFunc(): () -> String {
return { "Hello world!" }
}
fun main() {
val returned: () -> String = getFunc()
println("${returned()}")
}
Output:
Hello world!
上の例で、getFunc()関数は戻り値として文字列を返す関数を返す。main()関数ではこの関数を受け取って呼び出し、Hello world!という文字列を出力した。