Kotlin高階関数(Higher-Order Functions)
概要
高階関数(Higher-Order functions)は、関数型プログラミングでよく出てくる概念である。
次のいずれか1つ以上を満たすと、高階関数と呼ばれる。
- 1つ以上の関数を引数として受け取る。
- 関数を結果として返す。
これは、第一級関数(First-class Function)が成立する3条件のうち2つを満たすものであり、これを満たさない他のすべての関数は一次関数(first-order function)と呼ばれる。
つまり、関数を作る関数だと言える。
代表的な高階関数には、map、filter、reduce、lambdaなどがある。
高階関数
次の例は、関数を引数として受け取り、関数を結果として返す。
fun returnParamFunc(func: () -> String): () -> String {
return func
}
fun main() {
val hello: () -> String = { "Hello world!" }
val returned = returnParamFunc(hello)
print("${returned()}")
}
Output:
Hello world!
上の例のreturnParamFunc関数は、引数としてhelloを受け取り、再び関数を返している。この返された関数は"Hello world!"を出力した。
引数と戻り値の型
fun returnParamFunc(func: () -> String): () -> String {
return func
}
関数を引数として渡すときは、関数の変数名の後ろに: () -> Stringのように関数の型を明示する必要がある。
Intを引数として受け取り、Stringを返す関数は(Int) -> Stringのように書く。->の左側の括弧内の型((Int))は引数であり、->の右側の型(String)は戻り値の型を意味する。
引数としてIntを2つ渡すなら、(Int, Int) -> Stringのように書く。さらに多くの引数を渡す必要がある場合は、引数を追加すればよい。引数がない場合は、() -> Stringのように空の括弧だけを書く。
戻り値がない場合は、(Int, Int) -> UnitのようにUnitを入れればよい。