《Kotlin高阶函数完全指南从入门到精通的15个核心函数》引言作用域函数集合操作函数延迟执行函数判断/检查函数内联函数 inline核心重点引言Kotlin 的高阶函数是其最强大的特性之一它让代码更简洁、更具表现力。本文将基于实际代码示例全面介绍 Kotlin 中的作用域函数、集合操作函数、延迟执行函数、判断检查函数以及内联函数帮助你彻底掌握这些核心概念。作用域函数let — 空安全调用利器let 在对象上下文中执行代码块返回最后一行的结果最常用于空安全调用。/** * let在对象上下文中执行代码块返回最后一行结果常用于空安全调用 */funletDemo(){valnameKotlinvallengthname.let{Log.d(MainActivity2,it)it.length}Log.d(MainActivity2,$length)}/** * let 安全调用仅在 user 不为 null 时执行 */funletDemo1(user:User?){user?.let{Log.d(MainActivity2,name:${it.name})Log.d(MainActivity2,age:${it.age})}}run — 使用 this 作为上下文run 与 let 类似但使用 this 作为上下文引用同样返回最后一行结果。/** * run类似 let但直接使用 this 作为上下文返回最后一行结果 */funrunDemo(user:User?){valfinalStruser?.run{valfinalDataname:${user.name}age:${user.age}finalData}Log.d(MainActivity2,finalStr:$finalStr)}with — 非扩展函数形式with 不是扩展函数需要将对象作为参数传入适用于对同一对象进行多次操作。/** * with非扩展函数传入对象作为上下文返回最后一行结果 */funwithDemo(name:String,age:Int):String{returnwith(StringBuilder()){append(姓名:)append(name)append( )append(年龄:)append(age)append(岁)toString()}}apply — 对象初始化神器apply 返回对象本身非常适合用于初始化对象属性。/** * apply返回对象本身常用于初始化对象属性 */funapplyDemo():User{returnUser().apply{nameKotlin-Applyage15}}also — 附加操作的好帮手also 同样返回对象本身常用于日志记录、调试等附加操作。/** * also返回对象本身常用于附加操作如日志记录 */funalsoDemo(){valresultUser().also{Log.d(MainActivity2,开始记录)}.apply{nameKotlin-Also}.also{Log.d(MainActivity2,name:${it.name})}.apply{age15}.also{Log.d(MainActivity2,age:${it.age})}Log.d(MainActivity2,最终的结果:$result)}集合操作函数map — 元素类型转换将集合中的每个元素转换为另一种类型。/** * map将集合中的每个元素转换为另一种类型 */funmapDemo():ListInfo{valdataListmutableListOfUser()valuser1User().apply{nameKotlinage15}dataList.add(user1)valuser2User().apply{nameAndroidage16}dataList.add(user2)valmapListdataList.map{data-Info().apply{namedata.name agedata.age}}returnmapList}filterNotNull — 过滤空值/** * filterNotNull过滤掉集合中的 null 元素 */funfilterDemo():ListUser{vallistDatalistOf(User().apply{name这是一个userage10},null)valfinalDatalistData.filterNotNull()returnfinalData}forEach — 遍历集合/** * forEach遍历集合并执行操作 */funforEachDemo(){vallistDatalistOf(1,2,3,4,5)listData.forEach{Log.d(MainActivity2,$it)}}reduce — 累积计算/** * reduce从第一个元素开始累积计算 */funreduceDemo():Int{// reduce: 从第一个元素开始累积valnumberslistOf(1,2,3,4,5)valfinalDatanumbers.reduce{acc,n-accn}returnfinalData}groupBy — 分组/** * groupBy按条件分组返回 Map */fungroupByDemo():ListInt?{valnumberslistOf(1,2,3,4,5,6,7,8,9,10)// 按奇偶分组valgroupedByParitynumbers.groupBy{if(it%20)偶数else奇数}valfinalDatagroupedByParity[偶数]returnfinalData}sortedBy — 排序/** * sortedBy按指定规则排序 */funsortedByDemo():ListString{valwordslistOf(Kotlin,Java,Python,Go,Rust)valbyLengthwords.sortedBy{it.length}returnbyLength}延迟执行函数lazy — 懒加载lazy 委托属性只在首次访问时才创建对象常用于耗时的初始化操作。/** * lazy延迟初始化首次访问时才创建对象 */funlazyDemo():User{valuserInfobylazy{User()}returnuserInfo}repeat — 重复执行/** * repeat重复执行某段代码 n 次 */funrepeatDemo(){repeat(20){Log.d(MainActivity2,Hello Kotlin)}}判断/检查函数any是否存在至少一个满足条件/** * any是否存在至少一个元素满足条件 */funanyDemo():Boolean{valnumberslistOf(1,2,3,4,5)valhasEvennumbers.any{it%20}returnhasEven}all是否所有元素都满足条件/** * all是否所有元素都满足条件 */funallDemo():Boolean{valnumberslistOf(2,4,6,8,10)valallEvennumbers.all{it%20}returnallEven}none是否没有元素满足条件/** * none是否没有元素满足条件 */funnoneDemo():Boolean{valnumberslistOf(1,2,3,4,5)valnoEvennumbers.none{it%20}returnnoEven}count统计满足条件的元素个数/** * count统计满足条件的元素个数 */funcountDemo():Int{valnumberslistOf(1,2,3,4,5,6,7,8,9,10)valevenCountnumbers.count{it%20}returnevenCount}firstOrNull查找第一个满足条件的元素/** firstOrNull查找第一个满足条件的元素找不到返回 null */funfindDemo():Int?{valnumberslistOf(1,2,3,4,5,6,7,8,9,10)valsameAsFirstOrNullnumbers.firstOrNull{it%20}returnsameAsFirstOrNull}内联函数 inline核心重点Lambda 的本质问题普通的高阶函数在运行时每次调用都会创建一个匿名函数对象Lambda 对象带来额外的内存开销和性能损耗。// 普通高阶函数funoperateOnNumber(x:Int,operation:(Int)-Int):Int{returnoperation(x)}编译后近似等价于vallambdaobject:Function1Int,Int{overridefuninvoke(x:Int):Intx*2}valresultoperateOnNumber(5,lambda)// 每次调用都创建对象inline 解决方案使用 inline 关键字编译器会将函数体直接内联到调用处消除 Lambda 对象的创建inlinefunoperateOnNumber1(x:Int,operation:(Int)-Int):Int{returnoperation(x)}funinlineDemo(){valresultoperateOnNumber1(5){it*2}// 编译后代码会被内联为val result 5 * 2}inline 的两大好处消除 Lambda 对象创建 — 减少内存分配和 GC 压力支持非局部返回 — 可以在 Lambda 中直接 return 外层函数注意inline 虽好但不宜滥用。对于较大的函数体内联会导致字节码膨胀此时可考虑使用 noinline 或 crossinline。掌握这些高阶函数能让你的 Kotlin 代码更加简洁、优雅、高效。建议在实际开发中有意识地使用这些函数逐步形成函数式编程思维。