为什么要用?
- 官方的Demo 基本都是kotlin,可以相互转换,相互调用
- Java 替代语言,更简洁,清晰
- null 安全检测,延时初始化
- 避免了findViewbyid()
- 协程 ?原理
- 扩展函数和属性。譬如对String进行扩展
- 数据data类,自动生成get,set
- 用类委托来快速实现装饰器模式,不用接口类实现所有的方法();类似Animator.Listener
- Lambda表达式简化OnClickListener,with,apply,let
缺点
- 语法糖导致方法数增多。
- 表达式好用,可读性降低
原理
kotlin 如何做到延时初始化?
by lazy 和 lateinit 的区别
by lazy 修饰val的变量
lateinit 修饰var的变量,且变量是非空的类型
|
|
Kotlin 如何避免使用findViewByid()?
|
|
数据data类如何实现的
|
|
Lambda 表达式是什么?
- 匿名表达式:其实就是匿名函数的演进(类似的OnClickListener)
- 看起来Lambda表达式只是简化了匿名内部类的书写
- 事实上Lambda并非匿名内部类的语法糖
- Lambda的效率比匿名内部类要高.
- Lambda表达式其实被翻译成了本类的一个静态方法
特征:
- 可选类型声明:不需要声明参数类型,编译器可以统一识别参数值。
- 可选的参数圆括号:一个参数无需定义圆括号,但多个参数需要定义圆括号。
- 可选的大括号:如果主体包含了一个语句,就不需要使用大括号。
- 可选的返回关键字:如果主体只有一个表达式返回值则编译器会自动返回值,大括号需要指定明表达式返回了一个数值。
|
|
- 尝试去定义一个Lambda表达式
装饰器模式
- 用类委托来快速实现装饰器模式(就是类委托),不用接口类实现所有的方法();类似Animator.Listener(装饰器模式?)
- 类的委托即一个类中定义的方法实际是调用另一个类的对象的方法来实现的。
- Kotlin 直接支持委托模式,更加优雅,简洁。Kotlin 通过关键字 by 实现委托。 1234567891011121314151617// 创建接口interface Base {fun print()}// 实现此接口的被委托的类class BaseImpl(val x: Int) : Base {override fun print() { print(x) }}// 通过关键字 by 建立委托类class Derived(b: Base) : Base by bfun main(args: Array<String>) {val b = BaseImpl(10)Derived(b).print() // 输出 10}
协程
1.好处
- 避免回调地狱,类似RxJava.Zip
- 关键词:同步
- 避免创建大量线程而爆掉:譬如华为手机超过500个线程会爆掉
示例
- 理解
|
|
使用协程后的代码非常简洁,以顺序的方式书写异步代码,不会阻塞当前 UI 线程,错误处理也和平常代码一样简单。
首先,需要通过构造器来启动协程。官方目前提供的基础构造器有两个:
- launch
- runBlocking
它们都会启动一个协程,区别在于前者不会阻塞当前线程,并且会返回一个协程的引用,而后者会等待协程的代码执行结束,再执行剩下的代码。
其次,关于协程,Kotlin 新增了一个关键字:suspend ,被该关键字修饰的函数/方法/代码块只能由协程代码(也就是上述构造器的代码块参数内部)或者被 suspend 修饰的函数/方法/代码块调用。说简单一点,suspend fun 只能被 suspend fun 调用(协程构造器的最后一个参数的类型声明就是 suspend CoroutineScope.() -> Unit)。
|
|
其中的 delay 就是一个 suspend fun。
除了以上两点,另一个很重要的概念就是上下文(context)。协程虽然是依赖于线程的,但一个协程并非就绑死在一个线程上。启动协程的时候可以指定上下文,在协程内部也可以通过 withContext 切换上下文。而这个上下文,也就是一个 CoroutineDispatcher 类的对象,从名字可以看出,就是由它去进行协程调度。比如,如果你需要新建一个线程去跑协程的代码,可以这样:
|
|
- async 与 await
在这里, async 代码块会新启动一个协程后立即执行,并且返回一个 Deferred 类型的值,调用它的 await 方法后会暂停当前协程,直到获取到 async 代码块执行结果,当前协程才会继续执行。
参考文章: