
Android 基础补强 B04把 Kotlin 高阶函数、泛型、委托和 DSL 连成一条线摘要《第一行代码》的 Kotlin 课堂分散在多个章节。本文用文章筛选规则这一小场景解释函数参数、类型参数、行为委托和带接收者 Lambda 如何共同降低重复并指出抽象过度和隐藏缓存的风险。标签Kotlin、高阶函数、泛型、委托、DSL为什么要把分散的课堂放在一起读阅读全书时Android 功能章节不断推进Kotlin 课堂则在穿插补充语言能力。容易出现每一节都认识碰到 Compose 或 Gradle 脚本却仍觉得语法陌生的问题。本篇把这些知识围绕一个有限问题串联怎样声明文章筛选规则再由固定流程执行。书籍回查位置已经按目录核对6.5 是高阶函数入门7.6 是高阶函数应用8.5 是泛型和委托10.6 是泛型的高级特性13.7 是使用 DSL 构建专有语法结构。它们是不同层次的工具不能因为都能减少代码就当成可以互相替换。这也是基础补强与日课的区别项目日课优先完成实际需求本篇允许写一个小型语言练习但不要求把它引入只有几处调用的真实工程。高阶函数先解决变化的行为假设文章有标题和作者今天筛选有作者的内容明天筛选标题包含 Android 的内容。重复写两套遍历流程没有必要变化的是“是否接收这一项”的判断可以把它作为函数参数传入。dataclassRuleArticle(valtitle:String,valauthor:String?)funTselect(items:ListT,accepts:(T)-Boolean):ListTitems.filter(accepts)funselectKnownAuthors(items:ListRuleArticle):ListRuleArticleselect(items){!it.author.isNullOrBlank()}这是只依赖 Kotlin 标准库的独立片段后续示例使用同一个模型本次未编译。select 已经是高阶函数因为它接收函数参数调用者用 Lambda 提供具体规则。泛型 T 则让遍历不绑定 Article编译器仍保留输入元素与判断参数之间的类型关系。高阶函数与 Lambda实际工程可以直接使用标准库 filter不必为了“用了高阶函数”再包装一个同义函数。这里显式写出 select是为了看清哪一部分是流程哪一部分是可替换行为。泛型不等于把类型改成 Any若把 List改成 List调用者可能需要强制转换而且输入、输出之间的关联变模糊。类型参数能表达同一种元素类型贯穿函数减少不必要的运行期猜测。