1.Lambda简化表达
Kotlin 允许对 Java 的类库做一些优化,任何函数接收了一个 Java 的 SAM(单一抽象方法)都可以用 Kotlin 的函数进行替代。
view.setOnClickListener(object : OnClickListener {
override fun onClick(v: View) {
func()
}
})
view.setOnClickListener(listener: (View) -> Unit) //SAM用函数替代
view.setOnClickListener({ view -> func() }) //lambda简化
view.setOnClickListener({ func() }) //省略左边参数
view.setOnClickListener() { func() } //函数的最后一个参数是函数,放到()外
view.setOnClickListener { func() } //函数只有一个参数,省略()
Kotlin 可以定义带有接收者的类型函数类型:
val sum: Int.(Int) -> Int = { other -> plus(other) }
Kotlin 作用域函数:
函数 | 引用对象 | 返回值 | 是扩展功能 |
---|---|---|---|
let | it | Lambda result | Yes |
run | this | Lambda result | Yes |
run | - | Lambda result | No: called without the context object |
with | this | Lambda result | No: takes the context object as an argument |
apply | this | Context object | Yes |
also | it | Context object | Yes |
2.集合的高阶函数API
集合处理:map
对集合进行筛选:filter、filterNot、filterNotNull、count
求和:sum、sumBy、fold、reduce
分组:groupBy
处理嵌套集合:flatten、flatMap
3.集合库
集合:List,Set,Map
每一个集合都分为两种:可变集合(带 Mutable 前缀),只读集合。
4.惰性集合
惰性求值:在需要时才进行求值的计算方式。
在 Kotlin 中,序列(Sequence)中元素的求值是惰性的,即利用序列进行链式求值时,不需要像操作普通集合那样,每进行一次求值操作,就产生一个新的集合保存中间数据。
序列的操作分为两类:中间操作,末端操作。
中间操作采用惰性求值,只有在执行末端操作的时候,才会去出发中间操作的延迟计算。
序列与 Java 8 Stream 对比:
- Java 也能使用函数式风格API;
- Stream是一次性的;
- Stream能够并行处理数据。
5.内联函数
优化 Lambda 表达式带来的开销:Kotlin引入内联函数,Java引入 invokeddynamic 技术。
invokeddynamic:在运行期产生相应的匿名类代码,后续调用会直接采用这个匿名类代码。
内联函数:在编译期将函数体嵌入被调用的地方,以减少额外生成的匿名类数量,以及函数执行的时间开销。
避免参数被内联:noinline
实现 Lambda 非局部返回:使用 inline 实现,使用标签利用@符号实现。
避免 Lambda 非局部返回:crossinline
具体化参数类型:liline + reified