半小时入门Kotlin中的Lambda表达式

嘎子 Android, Kotlin 2017-05-26 719 次浏览 , , , 没有评论

在开始这个教程之前,我还是很有压力的,怎么样才能把这个问题说明白,真是挺让我头疼的。

先给大家来点基础知识吧:

一、函数式编程

有人说

也许继”面向对象编程”之后,”函数式编程”会成为下一个编程的主流范式(paradigm)。未来的程序员恐怕或多或少都必须懂一点。

虽然我并没有觉得它有这么大的意义,但说程序员都要懂一点还是很对的。你会发现无论是老牌的语言(如Java、PHP)还是当红的语言(如Ruby、Python还有今天要讲的Kotlin)都花了很大力气来支持函数式编程。

我也想对“函数式编程”下个定义,但发现真的不好做,只能通过他们的特征来描述“函数式编程”。

个人觉得,它最大的特征是“函数可以作为其他函数的参数”,也有人把这一点描述为:函数为一等公民。所谓”第一等公民”(first class),指的是函数与其他数据类型一样,处于平等地位,可以赋值给其他变量,也可以作为参数,传入另一个函数,或者作为别的函数的返回值。

这样做有很多好处,如代码简洁,开发速度快、接近自然语言,易于理解等。觉得从上面的2行代码就能看出这个问题了。

说了这么多,也与Lambda没什么关系啊。

其实不然,在Kotlin中支持函数式编程,有函数作为参数或返回值的函数在Kotlin中叫做“高阶函数”。

二、匿名函数

考虑下面一段代码:

意思应该不难理解,就是找出strings里面最长的那个。但是我个人觉得compare还是很碍眼的,因为我并不想在后面引用他,那我怎么办呢,就是用“匿名函数”方式。

(a,b)->{a.length < b.length}就是一个没有名字的函数,直接作为参数赋给max函数的第二个参数。但这个函数有很多东西都没有写明,如:

1、参数的类型

2、返回值的类型

但这些真的必要吗? a.length < b.length很明显返回一个Boolean的值,再就是max的定义中肯定也定义了这个函数的参数类型和返回值类型。这么明显的事为什么不让计算机自己去做而要让人写代码去做呢?这就是匿名函数的好处了。到这里,我们已经和Lambda很接近了。

三、Lambda表达式

Lambda 表达式就是被大括号括着的那一部分, 在-> 符号之前有参数声明, 函数体跟在一个-> 符号之后。写到这里,你可能不高兴了,什么Lambda表达式嘛,只不过是一种语法上简单一点的函数嘛(当然也可以匿名),恭喜你,答对了!

而且此Lambda表达式之前有一个匿名的函数声明(在此例中两个Int型的输入,一个Int型的返回值),这个声明是可以不使用的。则此Lambda表达式变成 val sum = { x: Int, y: Int -> x + y }?,此时 Lambda表达式会根据 主体中的最后一个(或可能是单个)表达式会视为返回值。

当然,在某些特定情况下,x、y的类型了是可以推断的,所以 val sum = { x, y -> x + y }。是不是感觉简单到没边了。

再来一个示例:

有人又不干了,你刚才还说要有一个->,该符号前面是参数,后面是表达式,参数呢!!!其实是这样的,当参数只有一个时,Kotlin会进行合理的推断。

首先Kotlin需要一个Int类型的参数,而it又是一个没有声明过的参数,那么好吧,Kotlin就会自动的认为it就是这个Int类型的参数。这样Kotlin就自己补齐了Lambda表达式。

最后来一个非常复杂的:

大家看明白了吗?如果明白了,恭喜你,你明白了什么是Lambda表达式,怎么使用Lambda表达式。半个小时还没有过去吧?

还需要解释一下,好吧:就是将一个整型的数组中所有大于0的数进行了累加。好吧,Kotlin比自然语言还简洁。

 

原创文章,转载请注明: 转载自TsonTec:测量解决方案提供者

本文链接地址: 半小时入门Kotlin中的Lambda表达式

相关主题

  • Kotlin中如何实现类似Java或C#中的静态方法2017-05-28 Kotlin中如何实现类似Java或C#中的静态方法 (0)
    大家可以在网络上搜到不少这样的文章,官方推荐是包级函数,也有人说用伴生对象(companion […]
  • 也赶个时髦,说说Kotlin那些事2017-05-25 也赶个时髦,说说Kotlin那些事 (1)
    自己之前很长时间都在用C#来进行桌面的编程,所以非常喜欢C#那种简洁、简单的语言风格。虽然有很多人在说C#的效率有问题(当然,Microsoft也一直在说C# […]
  • 在Java中调用Kotlin类的参数默认值对应的重载问题2017-06-02 在Java中调用Kotlin类的参数默认值对应的重载问题 (0)
    现在Android Studio中原生支持Kotlin了,全我们之前的项目一般都是用Java写的,所以在Android […]
  • 在Android Studio 3中使用Kotlin2017-05-26 在Android Studio 3中使用Kotlin (0)
    Android Studio 3中让Kotlin成为了默认语言,所以自己迫不及待的试用了一下,结果还是很让人激动的。 先分享一个Android […]
  • Kotlin中的data类–为数据而生,为数据而美2017-05-27 Kotlin中的data类–为数据而生,为数据而美 (0)
    我们在写程序时,不可避免的会进行数据的操纵。在进行数据操纵时,我们会专门的编写一些类。如果这些类写的多了,你会发现这些类都有一些比较类似的特点,因为这些特点的 […]
  • Kotlin中的When表达式2017-05-28 Kotlin中的When表达式 (0)
    如果之前有其他语言(如Java、C#等)的开发基础,那么在阅读和使用Kotlin时基本没有太大障碍,但有一个关键词是Kotlin中新出现的,那就是when。其 […]

说点什么

您将是第一位评论人!

提醒
avatar
wpDiscuz
回顶部