/**
* 高阶函数:接受一个参数是函数类型的函数,或者返回一个函数类型的值,就可以称为高阶函数
*/
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)进行运算