Kotlin核心编程-Lambda和集合

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

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。