当前位置:首页>安卓APP>保姆级学习开发安卓手机软件(二十一)--进阶Kotlin学习三(函数类型、函数类型的用法以及特定于 lambda 表达式的高级函数用法)

保姆级学习开发安卓手机软件(二十一)--进阶Kotlin学习三(函数类型、函数类型的用法以及特定于 lambda 表达式的高级函数用法)

  • 2026-08-20 20:09:09
保姆级学习开发安卓手机软件(二十一)--进阶Kotlin学习三(函数类型、函数类型的用法以及特定于 lambda 表达式的高级函数用法)

1. 将函数存储在变量中

函数也可以作为变量传递,我们简单通过一个例子就可以理解:
funtrick() {    println("trick!!!")}funmain() {    // 关键:手动重新输入这行,= 前后加两个冒号,避免编辑器解析偏差    val funtrick = ::trick    trick()    funtrick()}

2. 使用 lambda 表达式重新定义函数

代码如下:
var trick= {    println("trick!!!")}funmain() {    // 正确函数引用:赋值不加()    val funtrick = trick    // 直接调用原函数    trick()    // 通过引用变量调用函数:加()    funtrick()}

区别其实就是使用 lambda 表达式重写 trick() 函数,则引用的时候就是变量,就无须加两个冒号了。

2. 将函数用作数据类型

我们直接看带输入值的吧:

看例子:

var trick:(String)->Unit ={text ->    println("trick!!!")    println(text)}funmain() {    // 正确函数引用:赋值不加()    val funtrick = trick    // 直接调用原函数    trick("1")    // 通过引用变量调用函数:加()    funtrick("2")}

或者官方例子:

3.将一个函数作为参数传递到另一个函数

代码如下:

var trick:(String)->Unit ={text ->    println("trick!!!")    println(text)}funtruckFun(extrick:(String)->Unit){    extrick("从truckFun内部调用")}funmain() {    // 正确函数引用:赋值不加()    val funtrick = trick    // 直接调用原函数    trick("1")    // 通过引用变量调用函数:加()    funtrick("2")    truckFun(trick)}
你可能有点晕乎,看最后生成的信息就懂了:
当然,最后一句
truckFun(trick)
改成
truckFun { text -> trick("2") }
结果又不一样:

4.常用高阶函数的使用

高阶函数的使用可以让我们减少代码量,易于编程。

(1)repeat()重复

可以看到使用repear()函数的作用可以重复函数执行。

(2)forEach() 循环遍历列表
这个比较简单,类似c#的foreach,有些内容我就不打代码了,大家看看图,然后有想法的自己实现。
class Cookie(    val name: String,    val softBaked: Boolean,    val hasFilling: Boolean,    val price: Double)val cookies = listOf(    Cookie(        name = "Chocolate Chip",        softBaked = false,        hasFilling = false,        price = 1.69    ),    Cookie(        name = "Banana Walnut",         softBaked = true,         hasFilling = false,         price = 1.49    ),    Cookie(        name = "Vanilla Creme",        softBaked = false,        hasFilling = true,        price = 1.59    ),    Cookie(        name = "Chocolate Peanut Butter",        softBaked = false,        hasFilling = true,        price = 1.49    ),    Cookie(        name = "Snickerdoodle",        softBaked = true,        hasFilling = false,        price = 1.39    ),    Cookie(        name = "Blueberry Tart",        softBaked = true,        hasFilling = true,        price = 1.79    ),    Cookie(        name = "Sugar and Sprinkles",        softBaked = false,        hasFilling = false,        price = 1.39    ))
也可以只显示某一个属性(打印的时候,没打印用cookies.forEach{println(it.name)}即可):

(3). map()用于为集合中的项设置格式

例如上面,其实就是实现了列表遍历,并组合属性再放入新列表的过程。

(4). filter()过滤生成子集

上面的意思是检查softBaked属性是否等于true。
过滤出为true的元素。

(5). groupBy()可根据函数的返回值来拆分集合

代码:

println("------------------------")    val groupedMenu = cookies.groupBy { it.softBaked }    val softBakedMenu = groupedMenu[true] ?: listOf()	val crunchyMenu = groupedMenu[false] ?: listOf()    println("Soft cookies:")    softBakedMenu.forEach {        println("${it.name} - $${it.price}")    }    println("Crunchy cookies:")    crunchyMenu.forEach {        println("${it.name} - $${it.price}")    }

(6). fold()计算总价

 println("------------------------")    val totalPrice = cookies.fold(0.0) {//传入 0.0 作为初始值         total, // total累加器         cookie -> total + cookie.price  //计算 total 和 cookie.price 的总和.系统会将其推断为返回值,并会在下次调用 lambda 时为 total 传入此值。	}    println("Total price: $${totalPrice}")

(7). sortedBy()用于按指定属性对集合进行排序。

println("------------------------")    val alphabeticalMenu = cookies.sortedBy {    it.name	}    println("Alphabetical menu:")	alphabeticalMenu.forEach {    println(it.name)//饼干名称会按字母顺序输出。


小编明天就放假咯,年前有关技术文章应该不会再更新啦~~~让我们好好休整下,年后继续吧~~~~

最新文章

随机文章