関数をオブジェクトとして扱う

Kotlinでは関数をオブジェクトとして扱うことができます。

これによって、引数として受け取ったり、戻り値として返すことができます。

関数をオブジェクトとして扱う方法は3通りあります。

フォーマット

既存関数から関数オブジェクトを取得する場合

::関数名

関数リテラルで定義する場合

{  引数 [, 引数]... -> 処理 }

関数式で定義する場合

fun(引数[, 引数]...) = 式

関数リテラル、関数式の場合は、引数、戻り値の型を指定して定義することもできます。

{  (引数 : 型[, 引数 : 型]...) -> 処理  }

fun(引数: 型[, 引数: 型]...): 型 = 式

実装サンプル

配列のフィルタ条件を関数オブジェクトとして定義する場合

val array = arrayOf(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)

fun condition(x: Int): Boolean {
  return x % 2 == 0
}

val even = array.filter(::condition) // 既存関数から関数オブジェクト取得(偶数を抽出)

val odd = array.filter({x -> x % 2 == 1}) // 関数リテラルで指定(奇数を抽出)

val small = array.filter(fun(x) = x <= 5) // 関数式で指定(5以下を抽出)