半小时入门Kotlin中的Lambda表达式
在开始这个教程之前,我还是很有压力的,怎么样才能把这个问题说明白,真是挺让我头疼的。
先给大家来点基础知识吧:
一、函数式编程
有人说
也许继”面向对象编程”之后,”函数式编程”会成为下一个编程的主流范式(paradigm)。未来的程序员恐怕或多或少都必须懂一点。
虽然我并没有觉得它有这么大的意义,但说程序员都要懂一点还是很对的。你会发现无论是老牌的语言(如Java、PHP)还是当红的语言(如Ruby、Python还有今天要讲的Kotlin)都花了很大力气来支持函数式编程。
我也想对“函数式编程”下个定义,但发现真的不好做,只能通过他们的特征来描述“函数式编程”。
个人觉得,它最大的特征是“函数可以作为其他函数的参数”,也有人把这一点描述为:函数为一等公民。所谓”第一等公民”(first class),指的是函数与其他数据类型一样,处于平等地位,可以赋值给其他变量,也可以作为参数,传入另一个函数,或者作为别的函数的返回值。
1 2 3 |
val print = fun(i:Int){ console.log(i)} [1,2,3].forEach(print) |
这样做有很多好处,如代码简洁,开发速度快、接近自然语言,易于理解等。觉得从上面的2行代码就能看出这个问题了。
说了这么多,也与Lambda没什么关系啊。
其实不然,在Kotlin中支持函数式编程,有函数作为参数或返回值的函数在Kotlin中叫做“高阶函数”。
二、匿名函数
考虑下面一段代码:
1 2 3 4 |
fun compare(a: String, b: String): Boolean { return a.length < b.length } max(strings, compare) |
意思应该不难理解,就是找出strings里面最长的那个。但是我个人觉得compare还是很碍眼的,因为我并不想在后面引用他,那我怎么办呢,就是用“匿名函数”方式。
1 |
max(strings, (a,b)->{a.length < b.length}) |
(a,b)->{a.length < b.length}就是一个没有名字的函数,直接作为参数赋给max函数的第二个参数。但这个函数有很多东西都没有写明,如:
1、参数的类型
2、返回值的类型
但这些真的必要吗? a.length < b.length很明显返回一个Boolean的值,再就是max的定义中肯定也定义了这个函数的参数类型和返回值类型。这么明显的事为什么不让计算机自己去做而要让人写代码去做呢?这就是匿名函数的好处了。到这里,我们已经和Lambda很接近了。
三、Lambda表达式
1 |
val sum: (Int, Int) -> Int = { x, y -> x + y } |
Lambda 表达式就是被大括号括着的那一部分, 在-> 符号之前有参数声明, 函数体跟在一个-> 符号之后。写到这里,你可能不高兴了,什么Lambda表达式嘛,只不过是一种语法上简单一点的函数嘛(当然也可以匿名),恭喜你,答对了!
而且此Lambda表达式之前有一个匿名的函数声明(在此例中两个Int型的输入,一个Int型的返回值),这个声明是可以不使用的。则此Lambda表达式变成 val sum = { x: Int, y: Int -> x + y }?,此时 Lambda表达式会根据 主体中的最后一个(或可能是单个)表达式会视为返回值。
当然,在某些特定情况下,x、y的类型了是可以推断的,所以 val sum = { x, y -> x + y }。是不是感觉简单到没边了。
再来一个示例:
1 |
ints.filter { it > 0 } // 这个字面值是“(it: Int) -> Boolean”类型的 |
有人又不干了,你刚才还说要有一个->,该符号前面是参数,后面是表达式,参数呢!!!其实是这样的,当参数只有一个时,Kotlin会进行合理的推断。
首先Kotlin需要一个Int类型的参数,而it又是一个没有声明过的参数,那么好吧,Kotlin就会自动的认为it就是这个Int类型的参数。这样Kotlin就自己补齐了Lambda表达式。
最后来一个非常复杂的:
1 2 3 4 5 |
var sum = 0 ints.filter { it > 0 }.forEach { sum += it } print(sum) |
大家看明白了吗?如果明白了,恭喜你,你明白了什么是Lambda表达式,怎么使用Lambda表达式。半个小时还没有过去吧?
还需要解释一下,好吧:就是将一个整型的数组中所有大于0的数进行了累加。好吧,Kotlin比自然语言还简洁。
原创文章,文章首发于:Riley Ge (@rileyge) — Steemit
原创文章,转载请注明: 转载自TsonTec:测量解决方案提供者
本文链接地址: 半小时入门Kotlin中的Lambda表达式
很厉害,兄弟