《Kotlin实战》-第05章:Lambda编程

第五章 Lambda编程

lambda本质就是可以传递给其他函数的一小段代码。

5.1 Lambda表达式和成员引用
5.1.1 Lambda简介:作为函数参数的代码块

在代码中存储和传递一小段行为是常有的任务,为了简洁的达成目的,函数式编程提出可以把函数当做值来对待,使用lambda表达式后会更加简洁。
代码对比示例:

//java
button.setOnClickListener(new OnClickListener(){
    @Override
    public void onClick(View view){
        //点击后执行的动作
    }
})
//kotlin用lambda
button.setOnClickListener{/*点击后执行的动作/*}
5.1.2 Lambda和集合

对集合执行的大部分任务遵循几个通用模式,是个很好的展现lambda的场景。
下面的只是代码示例,看一哈即可。详细解读在后面章节。

//比较年龄找到最大的元素
//省略常规for循环,直接看lambda代码感受
data class Person(val name:String,val age:Int)
val people = listOf(Person("A",29),Person("B",33))
println(people.maxBy{it.age})
>>>>> People(name = A,age = B)

特别说明下maxBy,现在1.4版本已经升级为maxByOrNull。
下面为maxByOrNull的源码实现,上面的lambda表达式就是参数。

public inline fun <T, R : Comparable<R>> Iterable<T>.maxByOrNull(selector: (T) -> R): T? {
    val iterator = iterator()
    if (!iterator.hasNext()) return null
    var maxElem = iterator.next()
    if (!iterator.hasNext()) return maxElem
    var maxValue = selector(maxElem)
    do {
        val e = iterator.next()
        val v = selector(e)
        if (maxValue < v) {
            maxElem = e
            maxValue = v
        }
    } while (iterator.hasNext())
    return maxElem
}
5.1.3 Lambda表达式的语法

{x:Int,y:Int -> x+y}
lambda表达式语法要点

  • 始终用{}包围
  • 箭头前部分是实参,实参没有用括号括起来
  • 箭头后是函数体
  • 可以把lambda表达式存储在一个变量中,把这个变量当做普通函数对待
val sum = {x:Int,y:Int -> x+y}
println(sum(1,2))
  • 可以直接调用lambda表达式,有两种形式
    • { println(42) }() 不直观,可读性差
    • run{ println(42) }
  • 如果lambda表达式是函数调用的最后一个实参,就可以把它放到括号的外边
    • people.maxBy() {p:Person -> p.age}
  • 当lambda是函数唯一的实参时,还可以去掉代码中的空括号对
    • people.maxBy{p:Person -> p.age}
  • 如果lambda参数的类型可以
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值