天天看點

android開發之&android中的swift,kotlin高階函數和Lambda表達式(九)

/**
 * 高階函數:接受一個參數是函數類型的函數,或者傳回一個函數類型的值,就可以稱為高階函數
 */
fun main(args: Array<String>) {
    val cc = arrayOf(5,4,3)
    //{it>3}是一個Lambda表達式,作為filter函數唯一的也是最後一個參數,是以調用可以省略圓括号,it代表array中的
    //每一個元素
    val dd = cc.filter { it > 3 }

    val ee = arrayOf("Aa","Bb","cC","CCC")
    val ff = ee.filter { it.contains('c') }

    /**
     * 頂層函數引用
     */
    fun isEven(a:Int) = a % 2 == 0
    val ddd = arrayOf(5,4,3).filter { isEven(it) }
    //"::"一進制操作符要寫在函數名之前。花括号要改成正常函數調用的圓括号
    val ggg = arrayOf(5,4,3).filter (::isEven)

    /**
     * 成員函數和擴充函數的引用
     */
    val minValue = comboTwoValue(-1,2){a,b -> Math.min(a,b)}
    //簡化成函數引用的寫法
    val minValue2 = comboTwoValue(-3,4,Math::min)

    fun Int.isOdd() = this % 1 ==0
    val allOddNumbers = arrayOf(5,4,3).filter(Int::isOdd)

    val p = arrayOf("cool","kotlin","tutorial")
    val x = p.filter ( "kotlin"::equals)
    println(x)//此種引用稱為邊界引用,指的是給函數加了邊界
}
           
/**
 * Lambda表達式
 */
fun main(args: Array<String>) {
    /**
     * Lambda的使用
     * Lanbda表達式就是一個類型為函數類型的變量
     */
    val result = comboTwoValue(3,4, add)
    println(result)//結果:7
}
/**
 * Lambda的定義
 * Kotlin中的Lambda表達式寫法:{參數1,參數2.....參數n   -> 執行語句}
 */
fun add(x:Int,y:Int):Int{
    return x + y
}
//改成Lambda表達式,并指派給一個變量
var add = {x:Int,y:Int  ->
    x + y
}//注意:lambda表達式不允許出現return語句
fun comboTwoValue(x:Int,y:Int,method:(a:Int,b:Int) -> Int):Int{
    return method(x,y)
}
//第三個參數"method:(x:Int,y:Int)-> Int"的類型就是一個函數類型,注意函數類型的定義中,傳回值前面的冒号成了
//"->"。這是與函數定義上的一個顯著差別,這樣以後看到"——>"就知道這是一個函數類型定義
//method函數可以直接使用包含他的主函數comboTwoValue的2個參數(x和y)進行運算
           

繼續閱讀