Lambda和高阶函数
本文链接:
文章目录
lambda
1、lambda的由来
- 单词"lambda"源于希腊字母λ(小写lambda)
- "Lambda"一词最早起源于数学中的λ演算(lambda calculus),它是一种函数定义和函数应用的形式系统,由逻辑学家阿隆佐·邱奇(Alonzo Church)在20世纪30年代发明。
- 邱奇使用λ作为演算中的一个操作符,用于表示匿名函数。他选择使用希腊字母λ的原因是因为它在字母表中的位置不太常见,这样可以避免与其他符号混淆。
2、函数的声明
// 函数的声明
val method01:()->Unit
val method02:(Int, Int)->Unit
val method03:(String, Double)->Any // 相当于Object
val method04:(String, Double, Float)->Boolean
3、kotlin中Any和Java的Object有什么区别吗?
- Any是所有非空类型的超类型,类似于Java中的Object。Object不能持有null。
- Any?是所有类型的超类型,包括可空类型。
Any?可以持有null值
4、函数如何调用/函数的实现(lambda)?invoke是什么?
// 函数变量通过invoke()调用
// ()是运算符重载
// 函数的实现
val method01:()->Unit
method01 = {
println("我实现了method01") }
method01() // 调用函数:操作符重载
method01.invoke() // 调用函数:真实方法
// 方法三的实现
val method03:(String, Double)->Any // 相当于Object
method03 = {
name, number ->
println("$name $number")
name + number
}
println(method03("wch", 1234567.89))
5、函数的实现(传入函数)
val method04:(String, Double, Float)->Boolean
= fun(name:String, number:Double, age:Float):Boolean = (name+number+age).isEmpty()
method04("wch", 376.23, 1234.5f)
6、单一参数的lambda默认持有it ===> 函数式接口 ===> SAM
val method05:(Int)->Unit = {
print("$it")
}
7、下划线可以拒收 ===> 拒收
val method06:(Int, Int)->Unit = {
_, number->
println("$number")
}
8、作用是什么?
- 节省空间
- 接口版本变化,有的参数没用了
9、想要允许参数为null,需要用可空类型如String?
val method07:(String?,String)->Unit = {
sex, name -> println("$sex,$name")
}
method07(null, "wch")
10、Lambda不可以使用泛型作为参数类型
11、Lambda参数不可以给默认值 ===> 默认参数
12、Lambda Any->Any
// 传入什么,打印什么,还可以返回任何东西
val method18:(Any)->Any={
println("$it")
it // 还可以返回自己
}
13、Lambda配合扩展方法 ===> 扩展方法 ===> 官网写的Funciton,但是接收receiver
val method19: String.()->Unit = {
// this = String本身 == 调用者本身
println("你是$this")
}
"WCH".method19()
14、为什么method19可以成为String的扩展方法?
- 代码
val method19: String.()->Unit = { ... }
表示定义了一个接收者类型为String
的扩展函数类型。 String.()->Unit
表示该函数类型接收一个String
作为接收者,并返回Unit
类型(即没有返回值)。- 进一步理解:==> 匿名扩展函数
val method18: ()->Unit; // 类型是 函数
val method19: String.()->Unit // 类型是 String的扩展函数
val method20: (String)->Unit // 类型是 函数,该函数的参数是String
15、进一步融合this和it,区分扩展函数 和 参数的区别
val method20: Int.(Int) -> String = {
"两数相加的结果:${
this+it}"}
println(1.method20(10))
println(method20(1, 10)) // 1, 可以自动插为第一个参数
函数的形式:
fun Int.method21(n:Int):String{
return "两数相加的结果:${
this+n}"
}
println(2.method21(22))
// println(method21(2, 22)) // 不可以这样写了
输出(返回类型)
1、Lambda的返回类型:函数
/**============================
* 函数
*============================*/
// 默认Unit
fun t01(){
println() }
// 默认Unit