高階関数とは、他の関数を引数として受け取るか、他の関数を返す関数です。Kotlinはラムダ式を使用して、動作を値として簡単に渡します。
fun operateOnNumbers(a: Int, b: Int, operation: (Int, Int) -> Int): Int { return operation(a, b) } val sum = operateOnNumbers(3, 2) { x, y -> x + y } // sum = 5
fun multiply(x: Int, y: Int) = x * y operateOnNumbers(2, 3, ::multiply)
fun makeMultiplier(factor: Int): (Int) -> Int = { x -> x * factor } val triple = makeMultiplier(3) val result = triple(10) // 30
it)を持つことができます。関数の型宣言
(Int, Int) -> IntとFunction2<Int, Int, Int>の違いは何ですか?
答え: シンタックス(Int, Int) -> Intは、インターフェースFunction2<Int, Int, Int>のためのより「美しい」宣言(シンタックスシュガー)です。実際には、どちらの形式も完全に相互に交換可能です。
val f1: (Int, Int) -> Int = { x, y -> x + y } val f2: Function2<Int, Int, Int> = { x, y -> x + y }
しかし、ごく一般的に前者の形式が可読性から好まれます。
物語
大規模なイベント処理システムでは、インライン関数を使用せずにループ内に多数のラムダ式が作成されました。これにより、GCに対する負荷が高まり、パフォーマンスが低下しました。各呼び出しのために別々の匿名オブジェクト関数が作成されたためです。
物語
別の関数から関数を返そうとした際に、戻り値の関数のシグネチャが正しく指定されず、コンパイルエラーが発生し、原因の特定に時間がかかりました。エラーは以下の型のカッコの欠如にありました:
fun foo(): Int -> Intを正しいfun foo(): (Int) -> Intに修正する必要がありました。
物語
開発者は、明示的な型を指定せずにラムダを他の関数の引数として使用しようとしたところ、"cannot infer a type for this parameter"というエラーが発生しました。この問題は、ラムダまたは関数の引数の型を明示的に指定することで解決されました。