工具癖程序员

Kotlin的Lambda编程(一)

2018-10-23  本文已影响13人  神山上人

一,何为Lambda?

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

二,Lambda的作用

可以轻松的把通用的代码结构去程库函数,常见就是和集合一起工作,能够有效的缩短代码,使得代码更加简洁,在Kotlin中就使用了大量的Lambda表达,并且Kotlin的和java的能够无缝连接。

三,Lambda表达式和成员引用

java的点击事件会以内部类的形式进行操作,如下

button.setOnClickListener(new OnClickListener(){
@override
public void onClick(View view){
}
});

然而kotlin可以这样

button.setOnClickListener{
//操作
}
也可以这样
button.setOnClickListener{ view->
//操作
}
对比一下我们看起来是不是简单多了,是不是看起简单多了,代码看起来既美观也简洁,这还不算什么,好戏还在后面。

Lamdba与集合

继续我们的操作
一个集合 val list = listOf(Person("张三",22),Person("李四",33))
找出里面最大的年龄,当然你可以写一个方法进行再循环中判断查找,如果这样做你就是太Low了,现在告诉你们最简单的方法
list.maxBy{it.age} 这样就OK了,一句话搞定。是不是很神奇,其实这就会Kotlin内置的库函数 我们直接调用就完事,其中的 it.age就是实现这个逻辑的Lamdba,里面进行年龄的判断工作。

Lambda表达式的语法

{x:Int,y:Int -> x+y} 始终在大括号里面,在符号->前面的是参数,后面的函数体。例如:
val sum = {x:Int,y:Int -> x+y}
println(sum(1,2))

Kotlin有这样的一种语法约束,如果Lambda表达式是函数调用的最后一个实参,它可以放到括号的外边。

people.maxBy(){p:Person ->p.age}

当是唯一实参的时候,还可以去掉代码中的空括号对。Lambda还对类型可以进行类型的推导,上面的Person类型可以省略。使用默认参数也可以 it代替

使用默认参数名称

people.maxBy { it.age }  //其中it是自动生成的参数名称

在作用域中访问变量

Lambda中使用函数参数

fun test(message:Collection<String>,msg:String){
    messages.forEach{
        Log.d("tag","$msg $it")
    }
}

Kotlin中不会仅限于访问final变量,在Lambda内部可以修改这些变量

注意:
Java只允许你捕捉final变量,Kotlin可以访问非final,并可以修改它们。

成员引用

val getAge = Person::age//这个地方后面可以用泛型方式代替Person。
Person::age  //类和成员,前面是类,后面是成员。
//引用顶层函数 可以省略类直接写冒号。
fun salute() = println("sssss")
run(::salute)

这种省略了类名称,直接以冒号开头,成员引用::name被当做实参进行传递给run,它会掉相应的函数。
这部分到此结束!!
后面还有 集合的函数式API等用法,下期详解.....

作者写作不易,希望小小鼓励 ,将会是我前进的动力。欢迎指正。

上一篇下一篇

猜你喜欢

热点阅读