11. Lambda和高阶函数
2022年5月16日
11. Lambda和高阶函数
1. lambda
本质上就是匿名函数
1.1 java风格的匿名函数
java风格的
public class Test {
interface Printer{
abstract public void show();
}
private static void printAll(Printer printer){
System.out.println("行首");
printer.show();
System.out.println("行尾");
}
public static void main(String[] args) {
printAll(() -> {
System.out.println("行中");
});
}
}
kotlin中使用java风格的实现
interface Pinter{
abstract fun show()
}
fun test(p:Pinter){
println("行首")
p.show()
println("行尾")
}
fun main() {
test(object :Pinter{
override fun show() {
println("行中")
}
})
}
1.2 kotlin中 lambda的格式
{x:Int->"返回值"}
这是最基本的格式
x表示入参,"返回值"表示函数主题,}前的最后一行默认为返回值
lambda表达式是表达函数的方式,而一个匿名函数通常由参数,函数体,返回值组成。
1.2.1 匿名函数的类型声明
函数也是一种类型,就像普通的类,或是基本数据类
声明入参,返回值的函数类型
val sum:(x:Int)->String
val sum:((Int)->Int)? //当然由于它是一个类型,我也可以认为他是可空的
返回值为空的函数
val show :(String)->Unit
实现该函数的函数体
入参x:Int,y:Int,返回string的他们的和
val sum:(x:Int,y:Int)->String = {x,y->
"${x+y}"
}
入参String,返回空,在函数体里打印
val show :(String)->Unit
show={it-> println(it) }
show("苏伟苏伟苏伟")
示例
fun main() {
val onDay: (bug: Boolean, eat: Boolean, sleep: Boolean) -> Unit
val bug: (isFinash: Boolean) -> Boolean = { it ->
if (it) {
println("终于修复完了")
true
} else {
println("没修复完,客户痛苦,领导要崔")
false
}
}
val eat: (isDelicious: Boolean) -> Boolean = { it ->
if (it) {
println("今天的快餐很美味")
true
} else {
println("可能厨子今天心情不好")
false
}
}
val sleep: (isQuiet: Boolean?) -> Boolean = {
it->
if(it!=null){
if(it){
println("窗外很安静,睡了个好觉")
true
}else{
println("楼下敲锣打鼓办起了丧事或是喜事,我只觉得他们吵闹")
false
}
}else{
println("还没睡呢")
false
}
}
onDay= {bug,eat,sleep->
println("事情的成功与否仿佛并不重要")
println("一天便如此过去,我开始怀疑自己的存在的意义")
}
onDay(bug(false),eat(true),sleep(null))
}
2. 高阶函数
将函数作为参数或返回值的函数被称为高阶函数。
2.1 将函数作为参数和返回值
fun show(lambda:()->String,lambda1: () -> String) : (Int)->String {
println(lambda())
println(lambda1())
return {it->"$it"}
}
fun main() {
val a = {"赵思琪"}
val b = {"赵娓雪"}
println(show(a,b)(1))
}
2.2 为已存在的类型取别名
类型别名,可以为任意类型取一个别名, 只能是顶级的(Top-Level Only)
不能存在于类,接口,函数等中。
typealias type = (Int) -> Int
typealias onTypeString=String