如何读懂java代码并写出装逼的函数式代码

技术人员的发展之路
於之前发表
2012年的时候写过一篇叫《》的文章,我用算法来类比如何做选择,说白了就是怎么去计算,但是并没有讲程序员可以发展的方向有哪些。 所以,就算是有这些所谓的方法论,我们可能对自己的发展还是会很纠结和无所事从,尤其是人到了30岁,这种彷徨和迷惑越来越重。虽然我之前也写过一篇《》的文章,但是还是有很多做技术的人对于自己能否在年纪大时还能去做技术感到没有信心。我猜测,这其中,最大的问题的是,目前从事技术工作的种种负面的经历(比如经常性的加班,被当成棋子或劳动力等等),让人完全看不到希望和前途,尤其是随着年纪越来越大,对未来的越来越没有信心。同时,也是因为在GIAC的大会被问到,程序员老了怎么办?而在年底这段时间,也和几个朋友在交流中不断地重复谈到个人发展的这个话题。我的人生过半,活到“不惑”的年纪,自然经常性的对什么事都会回头看看总结归纳,所以,在交谈过程中和交谈过后,自己也有一些思考想记录下来。因为我本人也是在这条路上的人,所以,谈不上给他人指导,我同样也是在瞎乱折腾同样每天在思考自己要去哪儿的“一尘世间迷途老生”。况且,我的经历和眼界非常有限,因此,下面的这些关于个人发展的文字和思考必然是受我的眼界和经历所局限的。也欢迎大家补充和指正。这些东西不一定对,也不一定就是全部,期许可以让你在年底的时候有所思考,在明年的时候有所计划。一个重要阶段和标志在讲个人发展之前,我需要先说一下人生中的一个非常重要的阶段——20到30岁!这个阶段的首要任务,就是提升自己学习能力和解决难题的能力。这是一个非常非常关键的时间段!这个时间段几乎决定着你的未来。30岁以前,这个时间段,应该是人学习和积累的时间段,这个时间段,就是努力学习的时间段。这个时间段,你一定要把时间花在解决问题的技能上。就是说,你一定要练就成的技能是——你能解决大多数人不能解决的问题。使蛮力埋头加班苦干,当一个搬砖老黄牛的是肯定没有前途的。如果你不幸呆在了一个搬砖的地方,天天被业务压得喘不过气来,我建议你宁可让你的项目延期被老板骂,也要把时间挤出来努力学习基础知识,多掌握一些技术(很多技术在思路上是相通的),然后才能有机会改变自己目前的状况。因为,比起你的个人未来,项目延期被老板骂、绩效不好拿不到奖金,都不是什么事儿。总结一下,你在30岁前,工作5-7年,你需要拥有:高效的学习能力。这意味着——基础知识扎实、触类旁通、读英文文档不费劲、有寻找前沿知识的能力、能够看到问题和技术的本质、善于思辩、能独立思考。解决问题的能力。这意味着——你要高效的学习能力、见过很多的场景、犯过或是处理很多错误、能够防火而不是救火。如果你拥有这两个能力的现象是—— 在团队或身边的人群中的显现出Leadership。Leadership并不是当领导和经理,而是一种特征,这种特征有如下两个简单的表象:帮人解问题。团队或身边中大多数人都在问:“这问题怎么办?”,而总是你能站出来告诉大家这事该怎么办?被人所依赖。团队或身边中大多数人在做比较关键的决定时,都会来找你咨询你的意见和想法。一但你在在30岁之间出现了Leadership这样的特征,那么,你会进入一个正循环的阶段:因为你学习能力强,所以,你会有更多的机会解决难题。你有更多的机会解决难题,你就会学更多的东西,于是你就会更强。上面这个循环,只要循环上几年,就会让你人生的各种可能性大大的增加。【 注意 】要达到这样的特质,需要找到自己的长处、以及适合自己的环境。就像鱼的特长是呆在水里,让鱼儿去追求陆上动物的刺激生活并不靠谱。一般说来,有这样的潜质的人,在学校中就应该要出现。如果你在大学中还没有出现这样的潜质,那么,你在工作当中要加倍努力了(注:所谓的加倍努力,不是让你使蛮力加班,而是让你多学习成长,使蛮力拼命是弥补不了能力、思维、眼界上的缺陷的)。Leadership也有范围的,比如,身边的朋友,工作中的团队/部分,圈内,整个行业。Leadership的范围越大,你的个人发展的选择性就越高。反之则越小。如果已到了30岁左右,还是没有出现这样的特征。那么,可能未来你也很难有这样的Leadership了。而你的个人发展的可能性可能也就不多了(sigh…)读到这里,我必需要说一下,如果你已开始显现出你的Leadership,那么你才谈得上个人发展,这篇文章后续的内容也可能才会对你有意义。个人发展的三个方向以我个人短浅的经历和视野,目前只看到的人的发展有如下三个大方向(他们之间可能会有重叠):1)在职场中打拼2)去经历有意义有价值的事3)追求一种自由的生活这三个方向,我个人或多或少都体验过,我也见过身边的很多人走这三个方向走的比较成功。也许还有别的方向,没办法,现在,我的视野就这么大,所以,我在这里,我主要就是谈谈这三个方向。Again,人有资格去走这三个方向的前提是——已有了上面我说的Leadership那种特质!一、在职场中发展在职场中发展应该是绝大多数人的选择。通过加入公司来达到人生的发展。我们经常可以看到很多所谓的“职业规划”,但是大多数职业规划只不过人力资源搞出来的东西,和实际其实是有很大出入的。我的人生经历中,有18年左右是在公司中度过的,在过银行,小公司,大公司,民营公司,外国公司,传统IT公司,互联网公司,不同的公司完全有不同的玩法和文化,我的经历还算丰富,但也不算特别成功,这里只分享一些我在职场中的心得(不一定对,仅供参考)。1、去顶尖公司去顶尖公司的一个目的就是让你的Leadership的范围的可能性扩大。因为公司和公司的差距也不小,所以,就算你在低端公司里是骨干份子,但在高端公司里可能只是一个普通员工(就像中国足球队的主力到了英超可能都无法入选)。所以,在职场中,如果你要让你的个人价值最大化的话,你一定要去顶尖的公司。因为顶尖公司里有非常不错的工作方法和场景,这并不是能看书或是交流得来的,这是必需要去亲身体验的。所以说,在顶尖公司掌握的技能,开阔的眼界,通常来说都会比低端公司的要多得多。另外,每个公司的工作级别都是有相互对标的,比如:阿里的P几对应于百度的T几。国内的一线公司职位还相当,但是如果和国外一线公司的比,那就有差距了,而且差距还很大。比如,Google或Facebook的某个高级工程师,可能就对应于阿里的P8/P9甚至更高。是的,对于职场来说,如果你在顶尖公司是骨干,那么,你去低端公司,则有很大机会会成为他们高管和核心。就好像你在Facebook里干三五年成为他们的技术骨干,那么你到BAT去成成为高管概率是非常大的。反过来,如果你毕业主去了BAT成为了一个螺丝钉,在天天加班中度过你的青春,你干个十年能成为BAT的高管的概率可能会非常的低。2、去真正的创业公司去顶尖公司和去创业公司在某些时候并不冲突。不过,这里我想讲的是,一个技术能力强的人在大公司可能会被埋没掉。因为大公司业务成功后,成功的公司在招聘各种高级技术人才都不会成为问题,于是少你一个不少,多你一个不多。成功的公司其整个技术体系已经完成,Legacy的问题也比较多,所以,可以供你发挥的余地不大。成功的公司更多的可能会想要稳定的系统,稳定必然会产生保守,而保守则产生不思进取。所以,对于中高级人才来说,在大公司里的能产生的个人价值,可能远远不如那些求贤若渴、没有包袱、可以尽情施展、相对更为灵活和自由的创业型公司。不过,去创业公司需要小心仔细的挑选和评估,创业公司的不确定因素很多,也和创始人的因素太大了,所以,你需要小心了解创始人和他们的业务情况,想法和理念差不多才能更好的共事。好多创业公司其实并不是真正的创业公司,他们创业有很大的侥幸和驱利心理,要小心甄别。因为那不是真正的创业公司。3、职业生涯的发展阶段首先,有一个不争事实——整个社会是会把最重要的工作交给30岁左右的这群人的。也就是说,30岁左右这群人是这个社会的做事的中坚力量。所以,这是一个机遇!如果你有了Leadership,你就一定能在这个时间段内赶得上这个机遇——公司和领导对你寄于信任和厚望,并把重要的团队和工作交给你。于是,你的30岁到40岁就成了一个职业生涯的发展期,也就是你的事业上升期。如果你到40岁都没有赶上,那么你的职业生涯也就这样了,老有所成的人是少数。在你事业的上升期,你需要更多的软技能,比如:带领产品和业务的发展的能力推行自己喜欢的文化的能力项目管理的能力——在任务重、时间紧中求全沟通和说服别人的能力解决冲突的能力管理和发展团队的能力解决突发事件的应急能力…… ……另外,你还要明白在职场里的几个冷酷的事实:你开始要关心并处理复杂的人事。尤其在大公司,大量的人都是屁股决定脑袋,利益关系复杂,目标不一致,每个人心里都有不一样的想法。这个时候再也不是talk is cheap, show me the code!而是,code is cheap,talk is the matter。你需要花大量的时间去思考和观察形形色色的人。需要耗费大量的精力在不同的人之间周旋,而不是花时间去创造些什么有价值的东西。你要开始学会使用各种政治手段。办公室政治不可避免,越大的公司越重,自从你开始成为一线的leader的那一天起,你就开始成为“里外不是人”的角色,需要在下属和领导,员工和公司之间周旋。随而你的级别越来越高,你需要使用更多的政治手段,你会学会审时度世的站队,学会迎合员工和领导,学会用官员的语言说话,学会此一时彼一时,学会妥协和交换,学会忍气吞声,学会在在适当的时机表现自己,学会波澜不惊,学会把自己隐藏起来,甚至你还会迷失自我,开始学会一些厚黑学,比如不得不在适当的时机在背后捅人刀子……你可能会成为一个你自己都讨厌的人听上去真的好无聊,所以,你现在也明白为什么高层们都看上去很忙很累,而且抽不出时间来关心细节问题,因为,他们更多的是要协调整个组织和系统来运转,甚至还要四处周旋,各种博弈,没办法,这是职场的必需的东西!听起来是不是感觉人类很愚蠢?这真是没办法的事。如果你不想或是也没有能力玩这些东西,那么你需要去那些可以让技术人员安安心心做技术的公司。这类的公司,我见过Microsoft、Google、Amazon或是一些创业公司里都有。国内的大公司中也有让技术人员成长的职业成长线,但老实说,表面上看似是一个让人专心做技术的升职成长线,但其实还是管理岗位。所以,技术人员在职场中的归宿有两条路 —— 到真正的技术公司成为一个专心做技术的人,或是在成为一个职业的经理人。&二、追求人生的经历先说三个故事,第一个,是在阿里的时候,有一天在内网里看到一个贴子,一个做产品的女孩说自己准备离职要去法国学烘培厨艺,引得大家热评。第二个,是在亚马逊的美国老板,他每年都要去报个培训班学一个技能,比如:厨艺、开双翼飞机、夜总会里的DJ……、甚至去华盛顿去学当一个政客。第三个,是在汤森路透工作时,一个英国的同事,有一天他说他离职了,和自己的老婆准备用余生去周游世界,我问他是不是有足够多的钱了?他和我说,钱不够,他俩口子的计划是,边旅游边打工,打工打够到下一站的钱就走。他还说,那种用假期去另一个城市的旅游太没意思了,如果你不在那个地方生活上一段时间 ,你怎么能算是好的旅游体验呢?好吧,无法反驳。我是觉得他们把自己的人生过得如此有意思,令我很佩服。虽然跨界跨得有点猛,但是 Why Not?在这里,我想说,去追求一种和众人不一样的人生经历也是一件挺好的事,我个人感觉,比起在职场里有趣地多多了。如果你厌倦了职场,其实为什么不去追求一下不同的人生经历呢。就算你不想去追求跨度比较大的人生经历,那么,在技术圈里,也有很多有价值有意思的经历也可以去的。追求刺激有意义的与众不同的经历的人,其实也能算是一种人生的成功,不是吗?如果只说技术方面,我个人看到的去追求经历的人,有两种追求的人其实也很成功的:到技术创新的发源地去经历创新。计算机互联网各种技术的创新引擎,基本上来说,就是在美国了。我们赶上了这个时代,也选对了这个时代最火热的行业,那么,有什么理由不去这个时代的技术发动机那里去经历呢?在美国硅谷湾区,无论是大公司,还是创业公司,都在迸发着各式各样的创新,如果有能力有机会,为什么不努力去经历一下呢?不经历一下,老了不会觉得错过了是一种后悔吗?去经历下一个热点技术的发展。从IT,到互联网、再到移动互联网、云计算、大数据,再到未来的AI,VR,IoT……,技术创新的浪潮一波接一波的过来,你是想在那继续搬砖搬下去,是想迎浪而上去经历浪潮,还是想成为一个随波逐流的人?打工也好,创业也好,在国内也好,在国外也好,这些都是形式,不是内容。内容则是你有没有和有想法的人去经历有意义有价值事?人生苦短,白驹过隙,我们技术人员最大的幸运就是生在这样一个刺激的时代,那么,你还有什么理由不去追逐这些前沿刺激的经历呢?三、追求自由的生活我相信“自由”这个事,是所有人的心中都会想去追求的。“生命诚可贵,爱情价更高,…… ”(哈哈)但一说起自由,绝大多数人都想到的是“财富自由”或是“财务自由”,其实,并不完全是这样的,在自由的通路上,我个人的经历告诉我,其实,你会有很多的不同类型的自由。下面,是我对几个层次的“自由”的理解。第一层自由——工作自由。人的第一层自由的境界是——“工作自由”,我到不是说你在工作单位上可以很自由,虽然有特例,但并不普遍。我想说的“工作自由”是——你不会有失业危机感了。也就是说,你成了各个公司的抢手货,你不但不愁找不到工作,而且你是完全不愁找不到好工作。试想一下,如果是工作来找你,一方面,你就有真正意义上的工作选择权了,另一方面,你都不愁工作了,你完全就可以随时离职去干你想干的事了。此时,你就达到了“工作自由”。第二层自由——技能自由。工作自由已是不错,不过前提是你还是需要依赖于别人提供的工作机会。而技能自由则是你可以用自己的技能养活自己,而不需要去公司里工作。也就是所谓的自由职业者了,社会上,这样的人也不少,比如,一些健身体育教练、设计师、翻译者、作者……这些都可以算是自由职业者,程序员这个职业中只要不是搬砖的,有想法的,就有可以成为自由积业者的潜质,想一想,你拥有的编程能力,其实是一种创造的能力,也就是创造力,只要你Make Something People Want(YC创业公司的slogan),你是完全可以通过自己的技能来养活自己的。如果你通过某些自动化的东西,或是你在App上做了一个软件个体户,让自己的收入不断,甚至你做了一个开源软件,社区每个月都给你捐款捐到比你打工挣的还多,那么你就真正的有了技能自由了。第三层自由——物质自由。我把财务自由换了一种说法。我个人觉得,除了有个好爸爸之外这种特例的情况,如果你想有物质自由的话,本质上来说,你一定要学会投资,投资不一定是你的钱,时间也是一种财富,年轻更是,你怎么投资你的时间还有你的青春?你要把你的投资投到什么样的事,什么样的人?对于投资这个事,风险也比较大。但是,人生不敢冒险可能才是最大的冒险。这个世界有很多技术不是你能看书学来的,而要只能在实战中学会的,比如:游泳。投资可能也是一种。只有真正懂投资的人,或是运气非常好的人,才可能实现物质自由。追求自由的生活,其实也是个人发展道路上的一个不错的选择。通常来说,自由的人,能力都不差,钱也不会少。因为,他们懂得投资。也就是说,拥有追求自由能力的的人,不但有领导力和创造力(也可指导大多数人并走在大多数人前面)同时他还懂得怎么投资(知道时间和精力和金钱应该投在什么地方)(注:这里我没有提精神自由,老实说,精神上的自由我也不清楚是什么东西,因为我还没有见过,眼界有限,所以先按不表了,不然真成鸡汤文了)总结无论是在职场中打拼,还是追求精彩的经历,还是去实现自由,我觉得都是不错的个人发展的方向。他们都有重叠,比如:你可以在职场中去追求那些刺激的经历的公司。同样也可以通过加入有潜力高速发展的公司来达到自由。你也可以通过追寻不一样的经历来达到人生的自由。……总之,这里的逻辑是——能够去规划自己的个人发展的人,通常都是有很多机会和可能性的人。有很多机会和可能性的人,通常都是有Leadership,喜欢冒险的人。有Leadership喜欢冒险的人,通常都是学习能力强,思维活跃,喜欢折腾,懂得“投资”的人。学习能力强思维活跃的人,通常来说,都是喜欢看书,喜欢实践和新鲜事物,不怕艰难和挑战,用智力而不是使蛮力的人。懂得“投资”的人,通常来说,他们更多的关注的是未来和长远的成长,而不是当下的KPI、奖金和晋升。&插图来自电影《飞屋环游记》最后祝大家新年快乐,来年大展鸿图。
引用来源:
编程无忧成立于2014年初,关闭于2019年。
非常感谢!感谢您提供帮助让编程无忧变得更好。火车在她背后擦身而过,情况十分惊险。
派出所进行调查取证,依法对谢某某予以拘留。
声明:本文由入驻搜狐公众平台的作者撰写,除搜狐官方账号外,观点仅代表作者本人,不代表搜狐立场。
  今天在微博上看到了 有人分享了下面的这段函数式代码,我把代码贴到下面,不过我对原来的代码略有改动,对于函数式的版本,咋一看,的确令人非常费解,仔细看一下,你可能就晕掉了,似乎完全就是天书,看上去非常装逼,哈哈。不过,我感觉解析那段函数式的代码可能会一个比较有趣过程,而且,我以前写过一篇《函数式编程》的入门式的文章,正好可以用这个例子,再升华一下原来的那篇文章,顺便可以向大家更好的介绍很多基础知识,所以写下这篇文章。
  先看代码
  这个代码平淡无奇,就是从一个数组中找到一个数,O(n)的算法,找不到就返回 null。
  下面是正常的 old-school 的方式。不用多说。
  //正常的版本functionfind(x, y) { for( leti = 0; i & x. i++ ) { if( x[i] == y ) returni; } returnnull;} letarr = [ 0, 1, 2, 3, 4, 5] console.log(find(arr, 2)) console.log(find(arr, 8))
  结果到了函数式成了下面这个样子(好像上面的那些代码在下面若影若现,不过又有点不太一样,为了消掉if语言,让其看上去更像一个表达式,动用了 ? 号表达式):
  //函数式的版本constfind = ( f =& f(f) ) ( f =& (next =& (x, y, i = 0) =& ( i &= x.length) ? null: ( x[i] == y ) ? i : next(x, y, i+ 1))((...args) =& (f(f))(...args)))let arr = [ 0, 1, 2, 3, 4, 5]console.log(find(arr, 2))console.log(find(arr, 8))
  为了讲清这个代码,需要先补充一些知识。
  Java的箭头函数
  首先先简单说明一下,ECMA2015 引入的箭头表达式。箭头函数其实都是匿名函数,其基本语法如下:
  (param1, param2, …, paramN) =& { statements } (param1, param2, …, paramN) =& expression // 等于 : =& { } // 只有一个参数时,括号才可以不加:(singleParam) =& { statements }singleParam =& { statements } //如果没有参数,就一定要加括号:() =& { statements }
  下面是一些示例:
  varsimple = a =& a & 15? 15: simple( 16); // 15simple( 10); // 10letmax= (a, b) =& a & b ? a : // Easy array filtering, mapping, ...vararr = [ 5, 6, 13, 0, 1, 18, 23]; varsum = arr. reduce((a, b) =& a + b); // 66vareven = arr. filter(v =& v % 2== 0); // [6, 0, 18]vardouble = arr. map(v =& v * 2); // [10, 12, 26, 0, 2, 36, 46]
  看上去不复杂吧。不过,上面前两个 simple 和 max 的例子都把这箭头函数赋值给了一个变量,于是它就有了一个名字。有时候,某些函数在声明的时候就是调用的时候,尤其是函数式编程中,一个函数还对外返回函数的时候。比如下在这个例子:
  functionMakePowerFn(power) { returnfunctionPowerFn(base) { returnMath.pow(base, power); } }power3 = MakePowerFn( 3); //制造一个X的3次方的函数power2 = MakePowerFn( 2); //制造一个X的2次方的函数console.log(power3( 10)); //10的3次方 = 1000console.log(power2( 10)); //10的2次方 = 100
  其实,在 MakePowerFn 函数里的那个 PowerFn 根本不需要命名,完全可以写成:
  functionMakePowerFn(power) { returnfunction(base) { returnMath.pow(base, power); } }
  如果用箭头函数,可以写成:
  MakePowerFn = power =& { returnbase =& { returnMath.pow(base, power); } }
  我们还可以写得更简洁(如果用表达式的话,就不需要 { 和 }, 以及 return 语句 ):
  MakePowerFn= power =& base =& Math.pow(base, power)
  我还是加上括号,和换行可能会更清楚一些:
  MakePowerFn= (power)=&( (base)=&(Math.pow(base, power)))
  好了,有了上面的知识,我们就可以进入一个更高级的话题――匿名函数的递归。
  匿名函数的递归
  函数式编程立志于用函数表达式消除有状态的函数,以及for/while循环,所以,在函数式编程的世界里是不应该用for/while循环的,而要改用递归(递归的性能很差,所以,一般是用尾递归来做优化,也就是把函数的计算的状态当成参数一层一层的往下传递,这样语言的编译器或解释器就不需要用函数栈来帮你保存函数的内部变量的状态了)。
  好了,那么,匿名函数的递归该怎么做?
  一般来说,递归的代码就是函数自己调用自己,比如我们求阶乘的代码:
  functionfact(n){ returnn== 0? 1: n * fact(n -1);};result = fact( 5);
  在匿名函数下,这个递归该怎么写呢?对于匿名函数来说,我们可以把匿名函数当成一个参数传给另外一个函数,因为函数的参数有名字,所以就可以调用自己了。 如下所示:
  function combinator( func) { func(func);}
  这个是不是有点作弊的嫌疑?Anyway,我们再往下,把上面这个函数整成箭头函数式的匿名函数的样子。
  ( func) =& (func(func))
  现在你似乎就不像作弊了吧。把上面那个求阶乘的函数套进来是这个样子:
  首先,先重构一下fact,把fact中自己调用自己的名字去掉:
  function fact( func, n) { returnn== 0? 1: n * func(func, n-1);}fact(fact, 5); //输出120
  然后,我们再把上面这个版本变成箭头函数的匿名函数版:
  varfact = ( func, n) =& ( n==0? 1: n * func(func, n-1))fact(fact, 5)
  这里,我们依然还要用一个fact来保存这个匿名函数,我们继续,我们要让匿名函数声明的时候,就自己调用自己。
  也就是说,我们要把
  ( func, n) =& ( n==0? 1: n * func(func, n-1))
  这个函数当成调用参数,传给下面这个函数:
  ( func, x) =& func(func, x)
  最终我们得到下面的代码:
  ( ( func, x) =& func(func, x)) ( //函数体( func, n) =& ( n==0? 1: n * func(func, n-1)), //第一个调用参数5//第二调用参数);
  好像有点绕,anyway, 你看懂了吗?没事,我们继续。
  动用高阶函数的递归
  但是上面这个递归的匿名函数在自己调用自己,所以,代码中有hard code的实参。我们想实参去掉,如何去掉呢?我们可以参考前面说过的那个 MakePowerFn 的例子,不过这回是递归版的高阶函数了。
  HighOrderFact= function( func){ returnfunction(n){ returnn== 0? 1: n * func(func)(n- 1); };};
  我们可以看,上面的代码简单说来就是,需要一个函数做参数,然后返回这个函数的递归版本。那么,我们怎么调用呢?
  fact = HighOrderFact(HighOrderFact);fact(5);
  连起来写就是:
  HighOrderFact( HighOrderFact ) ( 5)
  但是,这样让用户来调用很不爽,所以,以我们一个函数把 HighOrderFact ( HighOrderFact ) 给代理一下:
  fact = function( hifunc ){ returnhifunc ( hifunc );} ( //调用参数是一个函数function(func){ returnfunction(n){ returnn== 0? 1: n * func(func)(n -1); }; });fact( 5); //于是我们就可以直接使用了
  用箭头函数重构一下,是不是简洁了一些?
  fact = (highfunc =& highfunc ( highfunc ) ) ( func=& n=& n==0 ? 1 : n* func(func)(n- 1));
  上面就是我们最终版的阶乘的函数式代码。
  回顾之前的程序
  我们再来看那个查找数组的正常程序:
  //正常的版本functionfind(x, y) { for( leti = 0; i & x. i++ ) { if( x[i] == y ) returni; } returnnull;}
  先把for干掉,搞成递归版本:
  functionfind(x, y, i=0){ if( i &= x.length ) returnnull; if( x[i] == y ) returni; returnfind(x, y, i+ 1);}
  然后,写出带实参的匿名函数的版本(注:其中的if代码被重构成了 ?号表达式):
  ( ( func, x, y, i) =& func(func, x, y, i)) ( //函数体( func, x, y, i=0) =& ( i &= x.length ? null : x[i] == y ? i : func(func, x, y, i+1)), //第一个调用参数arr, //第二调用参数2//第三调用参数)
  最后,引入高阶函数,去除实参:
  const find= ( highfunc =& highfunc( highfunc ) ) ( func=& (x, y, i = 0)=& ( i &= x.length ? null : x[i] == y ? i : func(func)(x, y, i+ 1) ));
  注:函数式编程装逼时一定要用const字符,这表示我写的函数里的状态是 immutable 的,天生骄傲!
  再注:我写的这个比原来版的那个简单了很多,原来版本的那个又在函数中套了一套 next, 而且还动用了不定参数,当然,如果你想装逼装到天上的,理论上来说,你可以套N层,呵呵。
  现在,你可以体会到,如此逼装的是怎么来的了吧?
  文章来源:酷壳-陈皓
  原文链接:/articles/17524.html
  近期热文
  进入程序源专属VIP微信群
  请添加小编微信:szweican(备注岗位)
欢迎举报抄袭、转载、暴力色情及含有欺诈和虚假信息的不良文章。
请先登录再操作
请先登录再操作
微信扫一扫分享至朋友圈
搜狐公众平台官方账号
生活时尚&搭配博主 /生活时尚自媒体 /时尚类书籍作者
搜狐网教育频道官方账号
全球最大华文占星网站-专业研究星座命理及测算服务机构
主演:黄晓明/陈乔恩/乔任梁/谢君豪/吕佳容/戚迹
主演:陈晓/陈妍希/张馨予/杨明娜/毛晓彤/孙耀琦
主演:陈键锋/李依晓/张迪/郑亦桐/张明明/何彦霓
主演:尚格?云顿/乔?弗拉尼甘/Bianca Bree
主演:艾斯?库珀/ 查宁?塔图姆/ 乔纳?希尔
baby14岁写真曝光
李冰冰向成龙撒娇争宠
李湘遭闺蜜曝光旧爱
美女模特教老板走秀
曝搬砖男神奇葩择偶观
柳岩被迫成赚钱工具
大屁小P虐心恋
匆匆那年大结局
乔杉遭粉丝骚扰
男闺蜜的尴尬初夜
客服热线:86-10-
客服邮箱:

我要回帖

更多关于 如何读懂代码 的文章

 

随机推荐