关于JDK 7有太多让人激动和兴奋的新特性,特别是Lambda表达式!如果你在搜索引擎中搜索JDK 7,你将会看到很多有关Lambda表达式的讨论,不断以来它都是一个有争议的话题,这也标明它遭到了很多的关注,但也正因为如此,它的发展脚步放缓了,并增加了决策的难度。
我的观点是Lambda表达式一定会包括在JDK 7中,你可以从网上或快照生成中看到少量的迹象。本文是为那些尚不理解函数式编程,或不知道Lambda表达式,闭包或局部套用函数是什么的人而写的。
Lambda表达式
Lambda表达式并不是什么新概念,自Alonzo Church提出Lambda微积分的概念以来,曾经有30个年头了,从那时末尾,它们就成为许多函数式编程言语的重要特性,最突出的可能要算Lisp,如今Lambda表达式曾经跻身于函数式编程言语的一等公民。Lambda表达式是一个匿名函数,为了演示,这里有一个段你可能经常看到的Python代码段:
以下是援用片段:list=[1,2,3,6,8,] printfilter(Lambdax:x*2gt;10,list) [6,8]
表达式"Lambda x: x * 2 10"是一个Lambda函数,在运转时它是匿名的,在filter函数中执行,类似地,你可以将相反的表达式赋给一个变量停止传递,或调用函数自身:
以下是援用片段:f=Lambdax:x*2gt;10 printfilter(f,list) [6,8] #Let'scallfitself f(1) False
在Java中,我们目前有匿名外部类证明Lambda表达式是匿名的,当传递给它一个方法时,它们就是一个普通的对象,如:
以下是援用片段:Filecwd=newFile(".); System.out.println(cwd.list(newFileFilter(){ publicbooleanaccept(Filef){ returnf!=nullf.getName().endsWith(".java"); }}));
如今可以将Lambda表达式复杂地当作一个匿名函数,在Java中,这可能意味着“回调”,真正的递归和其它功能,或许实现Comparator(比较器)接口筛选集合的日子将一去不复还了,如果它们在JDK 7中完成,估量我们将看到一个愈加动态的言语。
函数类型
正如前面提到的,Lambda表达式将引入另一个函数式编程概念:函数类型。它仅仅指的是将函数作为对象对待,就象是一个String或BigDecimal,它允许你象其它类型那样将其传递给其它函数。
闭包
你应该听说过闭包的概念,它是另一个非常复杂的函数式编程概念,它允许在一个函数中包括另一个函数,并可以在外部函数中援用外部变量,这种变量被称作“自由变量”,因为它们不是闭包的参数,也不是局部变量。
实际上,如果你阅读过有关JDK 7的文章,你会发现闭包一词的呈现频率比Lambda表达式还要多,这是因为它俩通常是一同呈现的,当Lambda表达式访问外部变量时,它就变成闭包,根据定义,闭包也是一种Lambda表达式。
高阶函数
高阶函数是指取得或前往另一个函数的函数,在本文开头的Python代码示例中,你应该曾经看到了filter函数,它就是一个高阶函数,因为它的第一个参数是一个函数,这个函数用于测试列表(第二个参数)中每个元素的内容。
局部套用函数
局部套用函数最好解释为“链条式”Lambda表达式,对于一个可接受多个参数的函数,局部套用函数是函数转换的过程,以便每个参数都被传递给函数,然后根据原始的函数调用前往。
以下是援用片段://"mul"isfunctionthattakestwoarguments; bothintsmul(5).(5); //returns25
其它还不错的函数式编程概念
其它我认为还不错的函数式编程概念有:
◆列表解析 – 为在一行命令中生成列表(集,映射等)的语法装饰,如“ListString l = (for x in someOtherCollection) { x.someMethod() x.another(); }”
◆尾递归 – 在语句的末尾调用自己的函数,编译器(或运转时环境)可以识别它,因此代码可以失掉分明的优化。
函数式编程有什么意义?
问得好,函数式编程的好处有许多,最分明的是全体代码量更少了,不用再为文件名过滤和比较等功能实现接口,你可以直接传递函数了。
小结
编程世界总是充斥着其它新时代的思想和传统,函数式编程只是其中一个优秀的软件开发方法,各有利弊,它可能会协助你写出更好的软件。不论如何,我相信Lambda表达式项目一定可以完成,虽然它仍然存在缺陷,但它会给编程言语带来新颖空气,也必将会遭到开发者的欢送。文章由
姿美堂整理,收集辛苦,希望能保留出处,谢谢斑竹大哥。