KMP学习day1–Kotlin集合高阶函数与参数技巧
Kotlin 是 KMP(Kotlin Multiplatform)的地基语言,写好 KMP 共享逻辑的第一步是把 Kotlin 区别于 Java 的日常语法吃透。本文聚焦两个最高频的主题:集合的高阶函数(map/filter)和函数的默认参数与命名参数。它们不炫技,却决定了 Kotlin 代码读起来的味道——简洁、不可变、表达力强。
集合操作:map 与 filter
各自的职责
filter:按条件筛选元素,返回只含满足条件元素的新集合。map:对每个元素做映射变换,返回新集合(元素个数不变,类型可以变)。
关键约定:两者都不修改原集合,每次返回新集合——这是函数式风格的「不可变思想」,数据流转清晰可追溯。
基础示例
从分数表筛出及格分,并整体加 5 分( bonus 场景):
valscores=listOf(78,55,92,45)valresult=scores.filter{it>=60}.map{it+5}println(result)// [83, 97],scores 原样不变链式调用从左到右读:先筛后变,一目了然。对从 ArkTS/TypeScript 转过来的开发者几乎没有学习成本——arr.filter(...).map(...)用法一致。
两个加分细节
先 filter 后 map:先筛掉不满足条件的元素,map阶段的计算量随之减少。顺序反过来功能等价,但会浪费变换运算。
大数据量用asSequence()惰性求值:普通链式调用每一步都会创建一个中间集合;asSequence()让元素逐个走完整条处理链再处理下一个,避免中间集合的内存开销:
valresult=scores.asSequence().filter{it>=60}.map{it+5}.toList()复杂度上,filter与map各遍历一次,整体 O(n) + O(n) = O(n)。
真实场景
列表页搜索过滤(filter)+ 数据模型转 UI 模型(map),是跨端项目里出现频率最高的组合之一;KMP 中共享层的业务数据也常用这对函数加工后再交给各端 UI。
函数:默认参数与命名参数
默认参数
函数定义时给参数指定默认值,调用时不传就取默认值——Java 里成堆的「参数组合重载」从此消失:
fungreet(name:String,greeting:String="你好",punct:String="!"){println("$greeting,$name$punct")}greet("小明")// 你好, 小明!命名参数
调用时用参数名 = 值的形式传参,作用有二:可以不按声明顺序传参;可以跳过有默认值的中间参数。
greet("小明",punct="?")// 只改标点,跳过中间的 greetinggreet(punct="!!",name="小明")// 顺序随便换解决了什么痛点
- Java:想「只传第 3 个参数」,必须为每个参数组合写一整套重载方法。
- ArkTS/TypeScript:要么把前面的参数用
undefined占位,要么把参数包成 options 对象(如router.pushUrl({ url: "..." }))。 - Kotlin:命名参数不包对象也能达到 options 对象的效果,还保留了编译期类型检查。
真实场景
KMP 网络层封装里非常典型:HttpClient(timeout = 30, retries = 3),调用方只写自己关心的参数,其余交给默认值——API 既灵活又自文档化。
小结
这两个特性合起来体现了 Kotlin 的设计取向:用声明式的集合链替代手写循环,用默认/命名参数替代重载与参数对象。它们是后续学习协程、Flow、KMP 共享模块 API 设计的 everyday 基本功——先让日常代码变简洁,架构层面的优雅才有着力点。