朱涛 · Kotlin 编程第一课
朱涛
Google 认证的 Kotlin、Android 开发者专家,博客“Kotlin Jetpack 实战”作者
6717 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 50 讲
朱涛 · Kotlin 编程第一课
15
15
1.0x
00:00/00:00
登录|注册

07 | 高阶函数:为什么说函数是Kotlin的“一等公民”?

你好,我是朱涛。
高阶函数在 Kotlin 里有着举足轻重的地位。它是 Kotlin 函数式编程的基石,是各种框架的关键元素。高阶函数掌握好了,我们理解协程的 launch、async 函数就会轻松一些,阅读协程的源代码也会不那么吃力;高阶函数理解透彻了,我们学习 Jetpack Compose 也会得心应手,在特定业务场景下,我们甚至可以用它来实现自己的 DSL(Domain Specific Language)。
不过,如果你没有函数式编程的相关经验,在初次接触高阶函数的时候,很可能会被绕晕。因为它是一个全新的概念,你很难从经典的 C/Java 里找到同等的概念迁移过来(Java 从 1.8 开始才引入相关概念)。然而,对于高阶函数这么重要的概念,Kotlin 官方文档又惜字如金。
文档里只是突兀地介绍了高阶函数、函数类型、Lambda 表达式的简单用法,接着就丢出一段复杂的代码案例,然后丢出一个更复杂的概念,“带接收者的函数类型”(Function Types With Receiver),接着又丢出了一段更复杂的代码案例。说实话,这真的让人难以理解。
所以今天这节课,我会采用 Java 和 Kotlin 对照的方式,来给你讲解 Kotlin 高阶函数的核心概念。并且我会通过一个实际案例,来帮助你理解其中最晦涩难懂的“带接收者的函数类型”,为你今后的 Kotlin 学习之路打下坚实的基础。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文深入探讨了Kotlin高阶函数及Lambda表达式的核心概念和使用方法。通过对比Java和Kotlin的代码,详细解释了高阶函数的优势和使用场景。文章首先阐述了Kotlin引入高阶函数的原因,并以Android中的View定义为例展示了高阶函数的典型应用。随后,详细介绍了函数类型、函数引用、高阶函数和Lambda表达式的概念,以及它们在Kotlin中的具体应用。通过实例和代码演示,读者能够深入理解这些概念。此外,文章还介绍了Lambda表达式的8种写法,帮助读者理解Lambda表达式的简写逻辑。另外,文章还涉及带接收者的函数类型,解释了其在Kotlin中的应用和意义。通过清晰的例子和解释,帮助读者理解了Kotlin高阶函数及Lambda表达式的核心概念和使用方法,为进一步学习和应用Kotlin函数式编程打下了坚实基础。文章还通过实例展示了如何将方法改写成属性,以及Kotlin高阶函数的性能优势。读者可以通过阅读Kotlin官方的标准函数库,深入探索高阶函数的原理和意义。整体而言,本文为读者提供了深入学习Kotlin高阶函数及Lambda表达式的重要参考资料。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《朱涛 · Kotlin 编程第一课》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(31)

  • 最新
  • 精选
  • 侯金博
    遭了,是要掉队的感觉

    作者回复: 扛住哈!一遍看不懂就多看几遍,还有就是多写代码多调试。

    2022-01-11
    4
    13
  • 讲道理嘛
    老师你好,关于带接收者的函数类型,我这样理解不知道对不对? fun User.test1(block: (user: User) -> Unit){} fun User.test2(block: User.() -> Unit){} 上面这两个高阶函数其实是等价的,只是在 lambda 表达式的使用时有区别。 前者的参数是 it,后者是 this(this 可以省略)

    作者回复: 没错,你的理解是对的。很赞~

    2022-05-20
    8
  • Paul Shan
    run:调用一个函数,作用仅仅限于构建lambda方便一点 带receiver的run:调用一个带receiver的函数,把this传给这个函数 with:用第一个参数调用第二个带receiver的函数,把this设定为第一个参数 apply:带receiver的函数高阶函数,参数为带receiver的函数,接受一个对象,把这个对象作为this传给参数并调用,返回this also:和apply类似,但是参数是带一个参数的函数,接受对象传给参数,其余和apply一样 let:和apply类似,但是返回值不是this,而是函数的返回 takeIf:带receiver的函数高阶函数,参数是一个判断函数,结果判断结果为真就返回this,否者null takeUnless:和take相反 repeat:参数为次数和函数,for循环执行函数

    作者回复: 很棒的答案!

    2022-03-19
    6
  • 女孩子家家
    简化了页面跳转~ private const val FRIEND_ID = "friendId" fun goto(mContext: Context, userId: Long) { mContext.goto<ChatActivity> { putExtra(FRIEND_ID, userId) } } inline fun <reified T> Context.goto(block: Intent.() -> Unit) { this.startActivity(intent<T>(this, block)) } inline fun <reified T> intent(mContext: Context, block: Intent.() -> Unit): Intent { val intent = Intent(mContext, T::class.java) intent.block() return intent }

    作者回复: 嗯,这也是高阶函数比较典型的应用场景。

    2022-01-10
    6
  • H.ZWei
    带接收者的函数类型能不能理解成是这个类的扩展函数,只不过是一个匿名函数。

    作者回复: 这是个很不错的比喻,赞!

    2022-03-21
    5
  • 大顺子
    1.第一个 run ,返回值为函数体最后一行,或指定 return 表达式 2.第二个 run ,在函数体中可以用 this 指代该对象,返回值为函数体最后一行,或指定 return 表达式 3.with 是将对象作为参数,在函数体中可以用 this 指代该对象,返回值为函数体最后一行,或指定 return 表达式 4.apply 在函数体内可以用 this 指代该对象,返回值为对象本身 5.also 在函数体内可以用 it 指代该对象,返回值为对象本身 6.let 在函数体内可以用 it 指代该对象,返回值为函数体最后一行,或指定 return 表达式 理解了上面那些,剩下的 takeIf 、takeUnless、repeat 就很好理解了。

    作者回复: 不错,讲的很详细,赞~

    2022-01-13
    2
  • Geek_518c5c
    fun User.apply(block: User.() -> Unit): User{ 请教这里的 User.()中的()代表什么意思。

    作者回复: 代表:无参数

    2022-04-28
    3
    1
  • neo
    // 函数引用 override val creator = ::PersonManager 函数引用中需要怎么去理解参数呢,因为并没有传参的地方

    作者回复: 调用的时候才传参哈~

    2022-04-06
    1
  • 白乾涛
    感觉带接收者函数类型讲的太复杂了,单独抽出来放到后面某个章节讲更好一点。

    作者回复: 后面的课程有持续介绍这个概念,如果不是很明白,可以继续往后看哈。

    2022-02-13
    1
  • 20220106
    apply和also这两个比较典型的,上下文对象作为【接收者】和作为【参数】,这两个的区别没太领会到

    作者回复: 这节课的内容确实比较绕,你也可以多看看文章里面的对比图,多体会一下。

    2022-01-12
    3
    1
收起评论
显示
设置
留言
31
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部