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!という文字列を出力した。