/**
* 高階函數:接受一個參數是函數類型的函數,或者傳回一個函數類型的值,就可以稱為高階函數
*/
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)進行運算