Kotlin 高阶函数 / 匿名函数 / Lambda
高阶函数 / 匿名函数 / Lambda
高阶函数 : 参数类型 或者 返回值 为 函数类型的函数 ,就称作 高阶函数。
匿名函数: 函数类型的对象,可以作为参数传递, 它它它!不是函数 注意
Lambda:同理 也是一个函数类型的对象
PS:怎么使用
- "::" 加 函数 => ‘::’ 标示函数引用,会拿到一个 函数的对象 ;注意不是函数本身!
- 就怎么使用 匿名函数,
- 就怎么使用 Lambda
示例代码记录
1. b 函数作为 a 函数的参数 ,需要写明 函数入参类型,以及返回值类型
// 引用函数 参数↓ - 返回值↓
fun a(funParam:(Int)->String):String{
return funParam(1)
}
fun b (param:Int):String{
return param.toString()
}
a(::b)
val dd = ::b
1.1 也可以写成下面这种匿名函数形式
" fun b" 中 方法名 b 可以省略
a( fun (param:Int):String{
return param.toString()
})
val dd = fun (param:Int):String{
return param.toString()
}
2、Lambda 规则
2.1 如果匿名函数作为入参 ,可以写成 Lambda
fun a(funParam:(Int)->String):String{
return funParam(1)
}
//可以写成这样
a({ param:Int->"测试001"
})
2.2 如果 Lambda 作为,入参的最后一个函数,可以写在括号外
a(){ param:Int->"测试001"
}
2.3 如果 Lambda 作为唯一入参,括号也能 ’省掉‘
a{ param:Int->"测试001"
}
2.4 如果 Lambda 是单参的 ,这个参数也可以不写了
kotlin 对于单参数 有唯一的 默认的名字 it
a{ "测试001"
}
a{ it.toString()+"测试001"
}
PS : Lambda 的返回值是去最后一行代码的值 别写 return;
2.5、函数对象 作为返回值
fun d (param:Int):Unit{
}
fun c(param: Int):(Int)->Unit{
return ::d // 这里需要加上 ‘::’ 这样就成为了一个对象(相当于 复制了一个有函数相同功能的的对象)
}
2.6 多参匿名函数
//多参匿名函数
val f = fun (parma:Int,parma2:String):String{
return parma2+parma
}
补充一点 :
Java8 开始支持 Lambda 表达式
-
Java 在使用 单 抽象方法的接口时,允许使用 lambda 表达式
-
在 Kotlin 中就不支持这么写了,因为没有必要(可以直接传函数对象你还跟我整这事?)
-
但在 Kotlin 和 Java 做交互的时候可以这么写
-
是因为 Kotlin 对Java 的 单 抽象方法接口, Kotlin 额外创建一个,把参数转换为函数类型的桥接方法
-
例如:
//Java view.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { } }); //Kotlin 中可以这么写 view.setOnClickListener { }
-
onClick(View v) {
}
});
//Kotlin 中可以这么写
view.setOnClickListener {
}
```