lambda表达式杂谈

上面的数据存放着一组人员姓名、年龄、性别相关的信息。 现在有一个需求, 获得年龄20岁以上,性别为女的人的姓名。 看到需求后, 很多人脑袋中产生的解决方案可能是这样的

代码执行的结果是[“夏香”,“秋香”]

很好,结果正确,考试的话肯定给满分。

但是这种实现方法有点过时,不潇洒,现在流行的做法应该是这样子

看, 一样的实现了要求,代码却简洁了许多。如果把代码的实现方式和我们平时的穿着来做对比, 这种实现方式就像是走时尚潮流尖端的穿着打扮,比如说电视里走在t台上的模特的穿着,因为这是es6的语法,由于要兼容老式浏览器的缘故,很多程序员不敢明目张胆的使用。

而前一种方法就像是上世纪的中山装,你穿出去没问题,但肯定会被人家说是土鳖。

更一般的符合大众审美的写法是这样子的

这种写法和第一种写法思路是相同的, 不同点在于,第一种方法使用的是lamda表达式,而这种方法使用的是匿名函数。

事实上,匿名函数在功能上和lambda表达式是没有差别的,只是叫法不一样,此外,lambda表达式写法更加简洁一些。

在javascript中,lamda表达式可以这样写

()=>{}

而匿名函数要这样写

function(){return;}

lambda表达式相对于匿名函数可以省略function和return两个关键字。

lambda的原理就是把函数当做另一个函数的参数来使用,以及不用声明这个函数,使用的时候可以直接写。

这一点我们的老前辈c语言和c++11之前的c++就做不到,在这两位前辈的世界里,要把函数当做参数传递需要使用函数指针, 使用前要先声明函数

test函数接受一个函数类型参数,callback函数就被作为这个参数传递。 这种写法没什么不好的,就是不够飘逸,就像金庸小说里的武功,这写法如同少林寺的七十二绝技,威力巨大, 却朴实无华,没有如凌波微步、北冥神功、天三六阳掌、天山折梅手这些武功那般吸引观众的眼球。

然而, 我们不能怪c和c++不够华丽, 毕竟这两门语言是上古时期的语言,是现在主流计算机语言们的祖宗, 从那个时代的角度去看待这样语言特性,已经是非常先进了。

就连之后的后起之秀java也没有做到这样好, java发展出了另一种丧心病狂的模式。 java8之前没有函数指针,没有匿名函数,更加没有lambda表达式。 在java中要实现这种编程模式只能使用类,可以是具名类, 也可以是匿名类, 在java的世界里,函数不能独立存在,它必须依赖于类。

于是,要把一个函数当参数传递, 只能传递一个类实例,这个类中再带上这个函数。

代码像这个样子

或者这样

原本几行代码可以搞定的事情却被写成了十几行,而且全是毫无意义的仪式性代码。怪不得人家常说java是用来写大型软件的,尼玛,几行代码硬生生被写成了几十行,这种写法能不大型吗

后来的java8支持lambda表达式,改善了这个问题,使java代码简洁了不少,但是那已经是java的第一个版本发布20年以后的事情了, 在这二十年里,不知道让多少java程序员写了多少无用的代码, 做了多少无用功。 但是谁叫它牛逼呢, 常年占据20%的编程语言份额, 死皮赖脸不知上进也没什么,吃老本都饿不死了。 看看人家c#, 够上进吧, 还不是连自己的腰都摸不到。

说到这里,不得不提一下我们亲爱的世界上最好的语言php,php有匿名函数,但是这个匿名函数算不算lambda表达式呢?从广义的角度去理解,应该算,因为匿名函数和lambda表达式能实现同样的功能。从狭义的角度理解,因该不算,lambda表达式讲究的是飘逸潇洒,匿名函数太臃肿了,如果它自认是lambda表达式, 我都替他不好意思。

php中的lambda表达式是这样写的

function test($callback) {

$callback();

}

function main() {

$data = [1,2,3,4,5];

test(function() use($data){

//dosomething

})

}

main函数调用test函数传递的就是匿名函数(lambda表达式),这种写法和老式的javascript一样,虽然不优雅,但也挺和谐的。

且慢,这个匿名函数为什么带一个use关键字, 这个use关键字是什么鬼?

话说php的匿名函数带个use关键字这事吧, 我觉得有好有坏。 php的匿名函数默认是无法访问匿名函数自身作用域除this关键字引用的类实例以外的变量的,从上面的示例来说, 如果不使用use关键字,匿名函数中的代码将无法访问$data变量。 use关键字的作用就是导入这个变量,使匿名函数可以访问它。 所以, 使用不方便,就是use关键字的坏处, 函数用个变量, 还要特定的关键字导入, 坑了个爹。

然而,凡事要看两面,使用use关键字也能带来好处。用了use关键字,我们一眼就能看出这个匿名函数用了哪些外部变量,这对代码的可维护性起到一定的正面作用。不过就我个人来讲,还是非常讨厌这个关键字的,我要的是方便,可维护性什么的, 一边玩去。哥揍是这么任性。

最后呢,我们聊一聊lambda表达式的集大成者, kotlin。这门语言想必认识的人不多,用的人更少,不过它亲爹做的产品程序员们是家喻户晓的, 如intellij idea、phpstorm、webstorm这些知名IDE都是, 这可都是除visual studio以外最好的集成开发环境。至于它的干爹,想必知道的人更多,google,成立不到二十年,市值超过微软,智能手机系统安卓就是他家的,可惜他家的拳头产品google搜索引擎在我们天朝无法使用。

kotlin的lambda表达式可以这样写

{}

就一个花括号,连常规的lambda表达式的括号和箭头都省了。 上面那个臃肿的java匿名类,换成kotlin就是这样子

protected void onCreate(Bundle savedInstanceState) {
    btn.setOnClickListener({
        //dosomething
    });
}

代码量瞬间减少了90%

有的同学要问了,这个lambda表达式如何接受参数

你可以这样

protected void onCreate(Bundle savedInstanceState) {
    btn.setOnClickListener({ item ->
        //dosomething
    });
}

这个箭头, 不用的时候可以省略,用的时候可以带上,多么人性化。

综上所述,论lambda表达式的易用性,kotlin排第二, 就没语言敢排第一。 另外,程序员在编程的时候, 一定要多用lambda,因为这是一种提高生产力的有力工具, 毕竟现在是二十一世纪了,要是再写上世纪80年代的代码,我都替他感到丢人。

原文发布于微信公众号 - 带你撸出一手好代码(gh_afab56b37671)

原文发表时间:2017-10-07

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏玄魂工作室

如何学python 第十七课 类-面向对象的概念

欢迎回来。今天要说的东西将会改变我们写程序的方式。今天我们介绍‘类’(class)。 概述 什么叫‘类’?类,类型。变量类型。从日常生活的感觉来说,‘类’其实...

27640
来自专栏编程微刊

2018年各大互联网前端面试题二(滴滴打车)

42720
来自专栏用户2442861的专栏

2015 华为 校招回忆录---篇(上)

本文由CSDN-蚍蜉撼青松【主页:http://blog.csdn.net/howeverpf】原创,转载请注明出处!

14520
来自专栏苦逼的码农

【面试现场】如何实现可以获取最小值的栈?

该公号有个「面试现场」的专题,感觉写的很不错,看了挺有收获,特地转载一篇过来给大伙,希望你们也能有所收获。如果喜欢的话,可以关注该公号呢----「互联网侦察」。...

20520
来自专栏CSDN技术头条

关于设计模式的思考

为什么叫设计模式 什么是设计模式 设计模式最初是被 GoF 于1995年提出的。GoF 全称是Gang of Four(四人帮),即 Erich Gamma,R...

37560
来自专栏编程

三撩Python

我不求深刻,只求简单。 --三毛 1、起手 我呢,一个咖啡师,咖啡使我忙碌与充实。 每天端起咖啡,香气弥漫,轻轻一口,就在那一刹那,没有时间,没有空间,没有纷纷...

18490
来自专栏Java帮帮-微信公众号-技术文章全总结

Java基础-day01-代码题

Java基础day01-代码题巩固 ? ? 第一题:分析以下需求,并用代码实现 1.定义一个HelloWold类 2.在类中定义主方法 3.在主方法中使用输出语...

35660
来自专栏Android机动车

设计模式——抽象工厂模式

● 为创建一组相关或依赖的对象提供一个接口,而无需指定他们的具体类型。是工厂方法模式的升级版。

7910
来自专栏阿凯的Excel

职场不得不知的排序技巧

排序是工作中最常用的功能,今天和大家分享一些排序的冷门应用,有多冷?就是在南方没暖气的那种冷! 不得不知的排序应用现在开始: 一:自定义序列 通常我们对文本...

30380
来自专栏工科狗和生物喵

【计算机本科补全计划】王道单科--栈的实现以及一些性质

正文之前 这几天深受《C++ Primer》困扰,昨晚看拷贝构造函数以及析构函数那一块真是看到快哭了。所以今天找点别的看看,缓解下因为看不懂Primer的书籍而...

32570

扫码关注云+社区

领取腾讯云代金券