hi各位,这章主要讲lambda表达式的快速入门。
大家都知道编程有OOP与FP(函数式编程),Kotlin是支持将函数像对象一样来使用的,所以就有了lambda表达式。
一:闭包: \"()->Int return{}\"
一个函数返回了一个内部函数,该内部函数引用了外部函数的相关参数和变量,我们把该返回的内部函数称为闭包。
// 一个函数返回了一个内部函数,该内部函数引用了外部函数的相关参数和变量,我们把该返回的内部函数称为闭包。
fun fun1(): () -> Int {
var out = 1
return {
out + 5//引用外了外部函数中的out参数变量。把这个叫为闭包
}
}
二:函数引用: \"::\"
是在高阶函数中使用,高阶函数是说在你的fun()的参数中有()->Int这种的函数引用。有这种的就叫做高级函数。
fun test2(n1: Int, n2: Int, testFun: (Int, Int) -> Int): Int {
return testFun(n1, n2)
}
fun test3Add(num1: Int, num2: Int): Int {
return num1 + num2
}
fun test3Multiply(num1: Int, num2: Int): Int {
return num1 * num2
}
//创建了test2()第三个参数是函数类型,所以test2就是高阶函数。第三个参数可以接受函数类型,可接收的范围是(Int,Int)->Int的,就是test3Add()和test3Multiply()这两个函数
//调用test2()方法,第三个参数选择传入test3Add()或者test3Multiply()就可以相加或者相乘的操作
fun fun2() {
//获取相加结果
val addResult = test2(10, 5, this::test3Add)
Log.e(\"fffpzf\", \"函数引用(::)获取到相加结果:$addResult\")
//获取相城结果
val multiplayResult = test2(10, 5, this::test3Multiply)
Log.e(\"fffpzf\", \"函数引用(::)获取到相乘结果:$multiplayResult\")
}
===
E/fffpzf: 函数引用(::)获取到相加结果:15
E/fffpzf: 函数引用(::)获取到相乘结果:50
===
三:lambda表达式 \"{}\"
在高阶函数的基础上,Kotlin可以自动推断出参数类型,返回值不需要写,自动判断出返回类型。
fun fun3() {
val test2 = test2(10, 5, { m, n -> m + n })
Log.e(\"fffpzf\", \"lambda表达式初步变形结果:$test2\")
}
fun fun4() {
//如果最后一个参数是lambda表达式,那么()可以前提,类似下面这种
val test2 = test2(10, 5) { m, n -> m + n }
Log.e(\"fffpzf\", \"lambda表达式有参变形结果:$test2\")
}
===
E/fffpzf: lambda表达式初步变形结果:15
lambda表达式有参变形结果:15
===
fun fun5() {
//如果lamdba是无参数的,在forEach{}中就是
val setOf = mutableSetOf<String>()
setOf.add(\"set_a\")
setOf.add(\"set_b\")
setOf.add(\"set_c\")
setOf.forEach {
if (it == \"set_a\") Log.e(\"fffpzf\", \"获取到:set_a\") else Log.e(\"fffpzf\", \"我是:$it\")
}
//下面这是forEach的源码,我们发现里面只有一个action: (T) -> Unit高阶函数,所以我们为什么在用forEach{}遍历的时候就直接用{}
//同时如果只有一个参数可以省略参数名,然后用it来替代它。这也就是为什么forEach{}中可以用it
@kotlin.internal.HidesMembers
public inline fun <T> Iterable<T>.forEach(action: (T) -> Unit): Unit {
for (element in this) action(element)
}
}
四:lambda表达式的返回值:{这里面的最后一行就是返回值}
五:一些lambda表达式例子
fun fun6() {
val setOf = mutableSetOf<String>()
setOf.add(\"set_a\")
setOf.add(\"set_b\")
setOf.add(\"set_c\")
setOf.add(\"set_b\")
setOf.forEach {
if (it == \"set_a\") Log.e(\"fffpzf\", \"获取到:set_a\") else Log.e(\"fffpzf\", \"我是:$it\")
}
var index = setOf.indexOfFirst {
//找到第一个叫set_b的下表
it.startsWith(\"set_b\")
}
Log.e(\"fffpzf\",\"第一个set_b下表:$index\")
val str=setOf.find {
it.startsWith(\"set\")
}
Log.e(\"fffpzf\",\"找到第一个set开头的全名:$str\")
setOf.filter {
//过滤
}
setOf.sortedBy {
//排序
}
setOf.groupBy {
//分组
}
}
继续阅读与本文标签相同的文章
-
数十万共享雨伞不翼而飞,创始人却高兴的要命!网友:赚翻了
2026-05-18栏目: 教程
-
滴滴 这是一见钟情的感脚
2026-05-18栏目: 教程
-
以实践的方式讨论:N-Gram原理与其应用
2026-05-18栏目: 教程
-
Hi拼团,第六代云服务器拼团购买更便宜,低至148元/年
2026-05-18栏目: 教程
-
汇编(五)栈、CPU提供的栈机制、push、pop指令
2026-05-18栏目: 教程
