首先辨别 函数 匿名函数 lambda 三者关系
函数 跟匿名函数和lambda是完全不同的
匿名函数和Lambda 基本相同
函数 必须是代码块一的书写方式: fun + 函数名 ( 形参:类型 . . .): 返回值类型{ }
匿名函数 是可以赋值给一个参数的,这给参数代表的是匿名函数的引用,不是函数相当于 双冒号加方法名
lambda表达式: 我们会发现大括号里没有用 return 关键字作为返回值。因为lambda 默认会将最后一行最为返回值
代码块一:
// 函数
fun method01(name: String): Int {
return name.length
}
代码块二:
// 匿名函数
val method02: (String) -> Int = fun(name: String): Int {
return name.length
}
// 简写
val method03: (String) -> Int = fun(name: String): Int = name.length
代码块三:
// Lambda 表达式
val method04: (String) -> Int = { name -> name.length }
val method05: (String) -> Int = { name: String -> name.length }
如何表示 (String) -> Int
val method1: (String) -> Int = { it.length }
val method2: (String) -> Int = { name -> name.length }
val method3: (String) -> Int = { name: String -> name.length }
val method4: (String) -> Int = fun(name: String) = name.length
val method5: (String) -> Int = fun(name: String): Int = name.length
val method6: (String) -> Int = fun(name: String): Int { return name.length }
调用
method1.invoke("")
如何表示 (String,String) -> Int
val method11: (String, Int) -> Int = { name, _ -> name.length }
val method12: (String, Int) -> Int = { _, age -> age }
val method13: (String, Int) -> Int = { name: String, _: Int -> name.length }
val method14: (String, Int) -> Int = fun(name: String, _: Int) = name.length
val method15: (String, Int) -> Int = fun(name: String, _: Int): Int = name.length
val method16: (String, Int) -> Int = fun(name: String, _: Int): Int { return name.length }
调用
method11.invoke("",0)
如何表示 (String,(String) -> Boolean) -> Int
高阶函数之 函数作为函数的参数
val method21: (String, (String) -> Boolean) -> Int = { name, _ -> name.length }
val method22: (String, (String) -> Boolean) -> Int =
{ _, method -> if (method.invoke("name")) 11 else 22 }
val method23: (String, (String) -> Boolean) -> Int =
{ name, method -> if (method.invoke(name)) 11 else 22 }
val method24: (String, (String) -> Boolean) -> Int =
{ name: String, _: (String) -> Boolean -> name.length }
val method25: (String, (String) -> Boolean) -> Int =
fun(name: String, _: (String) -> Boolean) = name.length
val method26: (String, (String) -> Boolean) -> Int =
fun(name: String, _: (String) -> Boolean): Int = name.length
val method27: (String, (String) -> Boolean) -> Int =
fun(name: String, _: (String) -> Boolean): Int { return name.length }
调用
// 传一个匿名函数 作为参数
method22("", fun(name: String): Boolean { return name.isNullOrBlank() })
// 传一个lambda 作为参数
i = method22.invoke("Hello", { name: String -> name.isNullOrBlank() })
如何表示 (String) -> (Boolean) -> String
val method31: (String) -> (Boolean) -> String = {
fun(sex: Boolean): String { return if (sex) "男" else it }
}
val method32: (String) -> (Boolean) -> String =
{ name -> { sex: Boolean -> if (sex) "男" else name } }
val method33: (String) -> (Boolean) -> String =
{ name: String -> fun(sex: Boolean) = if (sex) "男" else name }
val method34: (String) -> (Boolean) -> String =
fun(name: String) = fun(sex: Boolean) = if (sex) "男" else name
val method35: (String) -> (Boolean) -> String =
fun(name: String) = fun(sex: Boolean): String = if (sex) "男" else name
val method36: (String) -> (Boolean) -> String =
fun(name: String): (Boolean) -> String = fun(sex: Boolean): String = if (sex) "男" else name
调用
method31.invoke("不清楚").invoke(false)