快速上手 Kotlin 开发
张涛
“开源实验室”博主,资深 Android 开发工程师
23088 人已学习
新⼈⾸单¥59
课程目录
已完结/共 50 讲
第四章 :团队协作篇 (3讲)
快速上手 Kotlin 开发
登录|注册
留言
13
收藏
沉浸
阅读
分享
手机端
回顶部
当前播放: 07 | DSL的基础 : Lambda闭包的语法
00:00 / 00:00
高清
  • 高清
1.0x
  • 2.0x
  • 1.5x
  • 1.25x
  • 1.0x
  • 0.75x
  • 0.5x
网页全屏
全屏
00:00
付费课程,可试看
01 | 讲给你的 Kotlin 快速上手课程
02 | Kotlin 最基础语法
03 | Kotlin 与 Java 完全兼容,就可以随便调用了吗?
04 | 新手使用 Kotlin 常碰到的问题
05 | 函数也能嵌套?这个特性要注意
06 | 用扩展函数简化代码调用
07 | DSL的基础 : Lambda闭包的语法
08 | 函数的参数是函数 : 高阶函数的注意事项
09 | 创建对象的关键 : Kotlin的构造函数
10 | 伴生对象 : Kotlin 特有的单例对象
11 | by关键字的使用
12 | Kotlin 独有的特殊类
13 | 解构 : 特殊的数据拆箱方式
14 | Kotlin 的循环语法
15 | Kotlin海量的集合操作符
16 | 作用域函数 : 你会爱上的自带函数
17 | 运算符与中缀 : 定义你的专有运算符
18 | 神奇的符号 : Kotlin 的反引号
19 | DSL 是什么,原来早就用过了
20 | 构建 DSL 的常用方式
21 | 定义自己的 DSL
22 | 理解 Kotlin 中的常量与只读
23 | Kotlin 的空安全是如何实现的
24 | Kotlin 内联 : noinline与crossinline
25 | Kotlin 的真泛型与实现方式
26 | 协程 : 提升性能的利器
27 | 在Kotlin 中使用协程
28 | 协程的启动参数
29 | 协程的语法糖
30 | suspend : 知其然知其所以然
31 | 协程的内部实现原理
32 | 动手设计Kotlin 协程的yield
33 | 协程通信:Channel的使用
34 | 小结 : 动手设计Channel版的EventBus
35 | NIO 与 BIO
36 | Kotlinx-io 的对象缓存池
37 | Google 推出 KTX 的目的
38 | KTX 的实现
39 | KTX 小结
40 | 在团队中使用 Kotlin
41 | 用 Kotlin 改写现有工程
42 | 滥用特性的后果:没人懂的代码
43 | Kotlin 服务端开发框架
44 | Http Servlet 创建 Kotlin 版 Web 应用
45 | Spring Boot 创建 RESTful Web 服务
46 | Kotlin 开发 Web 前端
47 | Kotlin Native 开发
48 | 创建 Kotlin Native 基础库
49 | 如何用 Kotlin 实现 Android MVP
50 | Android MVP 的 Kotlin 代码&结课测试
本节摘要

源代码及 PDF 课件地址:

https://gitee.com/geektime-geekbang/KotlinPrimer

登录 后留言

全部留言(13)

  • 最新
  • 精选
哒哒LoveYou
Lambda参数限制在Kotlin1.3之后没有限制了吧! ```java /* * Copyright 2010-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license * that can be found in the license/LICENSE.txt file. */ package kotlin.jvm.functions import kotlin.jvm.internal.FunctionBase /** * A function that takes N >= 23 arguments. * * This interface must only be used in Java sources to reference a Kotlin function type with more than 22 arguments. */ @SinceKotlin("1.3") interface FunctionN<out R> : Function<R>, FunctionBase<R> { /** * Invokes the function with the specified arguments. * * Must **throw exception** if the length of passed [args] is not equal to the parameter count returned by [arity]. * * @param args arguments to the function */ operator fun invoke(vararg args: Any?): R /** * Returns the number of arguments that must be passed to this function. */ override val arity: Int } ```

作者回复: 嗯,是的,新版本没这个限制了。 毕竟视频录的时候还是1.1时候

2019-05-12
5
刘建
你好,有个问题想咨询下,我在Kotlin中调用Java中的一个参数为一个interface的方法,可以传一个lambda表达式。但是调用Kotlin中参数同样为同一个interface的方法的时候为啥没法传lambda。期待你的回复,困惑了我很长时间

作者回复: 其实你在kotlin中调java的interface也是不能直接传lambda的,你看到的像setonclicklistener这样的方法之所以能够直接传lambda,是因为kotlin单独做了重载,提供了一个可以传lambda的扩展函数

2018-08-12
3
2
蚂蚁内推+v
var ruunableOrigin = { name:String -> println("name") return name } 张涛老师,方便请教下 闭包为什么不能有返回值? 如果要有返回值可以吗?

作者回复: 闭包不能显示使用return,但是闭包的最后一条语句的结果就是闭包的返回值,视频里面有讲的。 因为闭包在编译以后会变成Function接口对象,这个对象的方法已经固定了返回类型,所以不能再用return。

2018-12-15
1
天空
为什么我现在用Java定义后运行 仍旧报java.lang.NoClassDefFoundError: kotlin/jvm/functions/FunctionN 我定义的 package kotlin.jvm.functions; import kotlin.Function; public interface Function23<P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11, P12, P13, P14, P15, P16, P17, P18, P19, P20, P21, P22, P23, R> extends Function<R> { R invoke(P1 p1, P2 p2, P3 p3, P4 p4, P5 p5, P6 p6, P7 p7, P8 p8, P9 p9, P10 p10, P11 p11, P12 p12, P13 p13, P14 p14, P15 p15, P16 p16, P17 p17, P18 p18, P19 p19, P20 p20, P21 p21, P22 p22, P23 p23); }

作者回复: 你的代码应该没问题,可以在github参考一下视频中的代码工程,看看是不是包名或者工程有问题。

2018-10-06
1
深水蓝
lambda 表达式其实是不是可以理解成C语言的函数指针?将函数作为参数传入给被调用的函数,被调用的函数通过这个函数指针执行这个参数所指定的程序。

作者回复: 可以这么理解,包括kotlin 中的函数参数也可以这么理解

2022-04-09
仗剑江湖
kotlin类中使用main方法报ClassNotFoundException,怎么搞

作者回复: 贴一下代码看看

2019-02-20
刘建同学的问题,可以这么解释: public static void show(JavaInterface javaInterface)的入参是个JavaInterface 接口实现类的实例对象 fun show(javaInterface: JavaInterface)也是如此,所以,这个fun show()可以接收一个JavaInterface类型的实例。但是lambda被翻译成java后对应的接口类型叫FunctionN 在Java里和JavaInterface 当然是不同的接口,所以不能传。 😀

作者回复: 是的,没错

2018-09-22
刘建
你好,可能我没有表达的很清楚,是这样的 public static void show(JavaInterface javaInterface) { javaInterface.addddd("sss"); } fun show(javaInterface: JavaInterface) { javaInterface.addddd("sss"); } fun main(args: Array<String>) { val a = { s: String -> println(s) } JavaMain.show(a) show(a) //没办法传入 } 就是上次两个方法,一个Java方法一个Kotlin方法,参数都为同一个接口。但是Kotlin方法没法传lambda表达式,不知道是什么原因

作者回复: 当然不行,你还得声明fun show(block: (str: String)-> Unit){ }这样的方法

2018-08-13
刘建
还有个问题想要咨询一下,lambda表达式和Function是不是两种不同的类型,Kotlin在编译的时候会将lambda表达式编译成匿名的Function内部对象吗,那么lambda这种类型是否支持继承

作者回复: 是不同类型,不支持继承的,没有继承lambda的语法

2018-08-12
刘建
接口继承了Function,传入Lambda表达式还是不行,请问有没有其他的方式

作者回复: function实际上与lambda是两种类型,只是编译后会被映射成同一个类型,你要声明lambda类型应该是()->Unit这种

2018-08-12
收起评论