第五章 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参数的类型可以

最低0.47元/天 解锁文章
846

被折叠的 条评论
为什么被折叠?



