Kotlin(二)高度関数(関数をパラメータとして、関数をパラメータとして)

3555 ワード

一、概説
JS,Cなどの言語では関数式のプログラミングが一般的であり,関数はパラメータとして渡され,ターゲット関数で呼び出される.柔軟で簡潔なプログラミング方式です.Javaは直接関数をパラメータとして使用することができず,オブジェクトの参照しか伝達できないため,コールバック関数が必要な場合,インタフェースの匿名実装が伝達されることが多い.
二、高次関数の例
高次関数:別の関数をパラメータとして、または戻り値が関数である高次関数と呼ばれるlambdaの構文糖関数をパラメータとして補充する必要があります:コールバック関数の役割、クラス比インタフェースの戻り値は関数です:参照多態作用
2.1、パラメータを持たない関数をパラメータとする
fun main(args: Array) {

    //lambda          ,                       
    action(2){
        println("      --  1     ")
    }

    //lambda       
    action(1,{
        println("      --  2     ")
    })


    //           
    var method:()->Unit = {
        println("      --  3     ")
    }
    action(3, method)
}

/**
 *        
 */
fun action(first:Int, callback:()->Unit){

    //  
    callback()
}

2.2、パラメータと戻り値関数をパラメータとして使用する
fun main(args: Array) {

    action(1){it-> //Lambda  ,       
        println("      = : $it")

        true//Lambda  ,               
    }
}

/**
 *        
 */
fun action(first:Int, callback:(Int)->Boolean){

    //  
    if(callback(1)){
        println("        true")
    }else{
        println("        false")
    }
}

2.3、高級関数は一つの関数を返す
関数は戻り値として、パラメータとして関数がなく、シーンが広いです.いくつかの状態の判断とのサブロジックに用いることができて、多態の作用があります.いくつかの異なる論理を指すことができます
fun main(args: Array) {

    var method: (Int, Int) -> Int
    method = action()
    println(method.invoke(1, 2))

    method = action2()
    println(method.invoke(1, 2))

}

/**
 *        
 */
fun action(): (Int, Int) -> Int {

    //    

    return { j, i ->
        j + i
    }
}

fun action2(): (Int, Int) -> Int {

    //    
    return { j, i ->
        j - i
    }
}