阅读更多

25顶
9踩

编程语言

转载新闻 JDK 7中的函数式编程思想

2010-08-12 10:08 by 见习记者 jxpath 评论(35) 有14085人浏览
关于JDK 7有太多让人激动和兴奋的新特性,特别是Lambda表达式!如果你在搜索引擎中搜索JDK 7,你将会看到很多有关Lambda表达式的讨论,一直以来它都是一个有争议的话题,这也表明它受到了很多的关注,但也正因为如此,它的发展脚步放缓了,并增加了决策的难度。

51CTO推荐阅读:再探Java 7:最新特性更新、代码示例及性能测试

我的观点是Lambda表达式一定会包含在JDK 7中,你可以从网上或快照生成中看到大量的迹象。本文是为那些尚不了解函数式编程,或不知道Lambda表达式,闭包或局部套用函数是什么的人而写的。

Lambda表达式

Lambda表达式并不是什么新概念,自Alonzo Church提出Lambda微积分的概念以来,已经有30个年头了,从那时开始,它们就成为许多函数式编程语言的重要特性,最突出的可能要算Lisp,现在Lambda表达式已经跻身于函数式编程语言的一等公民。Lambda表达式是一个匿名函数,为了演示,这里有一个段你可能经常看到的Python代码段:

list = [1, 2, 3, 6, 8,] 
print filter(Lambda x: x * 2 > 10, list) 
[6, 8]
表达式"Lambda x: x * 2 > 10"是一个Lambda函数,在运行时它是匿名的,在filter函数中执行,类似地,你可以将相同的表达式赋给一个变量进行传递,或调用函数自身:

f = Lambda x: x * 2 > 10 
print filter(f, list) 
[6, 8] 
# Let's call f itself 
f(1) 
False
在Java中,我们目前有匿名内部类证明Lambda表达式是匿名的,当传递给它一个方法时,它们就是一个普通的对象,如:

File cwd = new File(".); 
System.out.println(cwd.list(new FileFilter() { 
    public boolean accept(File f) { 
        return f != null && f.getName().endsWith(".java"); 
    } 
}));
现在可以将Lambda表达式简单地当作一个匿名函数,在Java中,这可能意味着“回调”,真正的递归和其它功能,或许实现Comparator(比较器)接口筛选集合的日子将一去不复还了,如果它们在JDK 7中完成,预计我们将看到一个更加动态的语言。

函数类型

正如前面提到的,Lambda表达式将引入另一个函数式编程概念:函数类型。它仅仅指的是将函数作为对象看待,就象是一个String或BigDecimal,它允许你象其它类型那样将其传递给其它函数。

闭包

你应该听说过闭包的概念,它是另一个非常简单的函数式编程概念,它允许在一个函数中包括另一个函数,并可以在内部函数中引用外部变量,这种变量被称作“自由变量”,因为它们不是闭包的参数,也不是局部变量。

实际上,如果你阅读过有关JDK 7的文章,你会发现闭包一词的出现频率比Lambda表达式还要多,这是因为它俩通常是一起出现的,当Lambda表达式访问外部变量时,它就变成闭包,根据定义,闭包也是一种Lambda表达式。

高阶函数

高阶函数是指取得或返回另一个函数的函数,在本文开头的Python代码示例中,你应该已经看到了filter函数,它就是一个高阶函数,因为它的第一个参数是一个函数,这个函数用于测试列表(第二个参数)中每个元素的内容。

局部套用函数

局部套用函数最好解释为“链条式”Lambda表达式,对于一个可接受多个参数的函数,局部套用函数是函数转换的过程,以便每个参数都被传递给函数,然后根据原始的函数调用返回。

// "mul" is function that takes two arguments; both ints 
mul(5).(5); // returns 25
其它还不错的函数式编程概念

其它我认为还不错的函数式编程概念有:

◆列表解析 – 为在一行命令中生成列表(集,映射等)的语法装饰,如“List<String> l = (for x in someOtherCollection) { x.someMethod() && x.another(); }”

◆尾递归 – 在语句的末尾调用自己的函数,编译器(或运行时环境)可以识别它,因此代码可以得到明显的优化。

函数式编程有什么意义?

问得好,函数式编程的好处有许多,最明显的是整体代码量更少了,不用再为文件名过滤和比较等功能实现接口,你可以直接传递函数了。

小结

编程世界总是充斥着其它新时代的思想和传统,函数式编程只是其中一个优秀的软件开发方法,各有利弊,它可能会帮助你写出更好的软件。不管如何,我相信Lambda表达式项目一定可以完成,虽然它仍然存在缺陷,但它会给编程语言带来新鲜空气,也必将会受到开发者的欢迎。

原文作者:Alex Collins

原文名:Functional Programming Concepts in JDK 7


世界真的是疯了~~~~都都将回归了
25
9
评论 共 35 条 请登录后发表评论
15 楼 joeyhacker 2010-08-13 10:13
ynyangtao 写道
java他不再高贵,越来越像javascript了。是不是得考虑转行了????

快点转吧, 这行就多你了
14 楼 ynyangtao 2010-08-13 10:04
java他不再高贵,越来越像javascript了。是不是得考虑转行了????
13 楼 xyqck163 2010-08-13 09:58
java 越来越垃圾了。  既然面向对象就不要搞函数式。 
12 楼 xyqck163 2010-08-13 09:57
我想知道java7中使用闭包是否会造成内存溢出,如何有效的控制垃圾回收。
11 楼 night_stalker 2010-08-13 09:46
貌似这个是语法糖方案?展开成单方法匿名内部类,只能捕获 final 的局部变量。
另外由于缺乏动态类型/推断,写起来总有点别扭的 …… 可以称为“半闭包” ……
10 楼 dabian_guo 2010-08-13 09:46
ray_linn 写道
C#, groovy都有的东西,Java现在才有。。。诶,落后啊


实施上没有这些乱七八糟的所谓先进语言的特性,JAVA也不比任何语言落后。你让C# groovy情何以堪啊
9 楼 ray_linn 2010-08-13 09:27
C#, groovy都有的东西,Java现在才有。。。诶,落后啊
8 楼 Leon.Wood 2010-08-13 09:26
前途堪忧啊...赶紧学python
7 楼 wese345 2010-08-13 09:22
以前就有过关于该表达式的一篇讨论,当时真没看懂,惊讶于jdk里还有这东西
6 楼 caiceclb 2010-08-13 09:12
感觉有点诡异的语法
5 楼 jxpath 2010-08-13 09:00
最终还得回归C语言的编程方便性和函数式,还有高效率
4 楼 unika_ly12 2010-08-13 08:35
当语言变的越来越复杂,也快失去它的生命力了
3 楼 aflyeagle 2010-08-12 19:46
好深奥啊,都看不懂。强烈学习中![color=red][/color][size=large][/size]
2 楼 无厚之刃 2010-08-12 17:48
scala的闭包确实很强大

再有类型推断就好了
1 楼 chenxiang105 2010-08-12 13:26
好东西.. 我的去看看了.

发表评论

您还没有登录,请您登录后再发表评论

相关推荐

  • ie浏览器java不弹窗_解决IE屏蔽Java Applet问题的方法 .

    利用Java虚拟机程序来实现,一般通过在IE中设置ActiveX控件启用选项即可解决。什么是ActiveX控件?ActiveX是Microsoft对于一系列策略性面向对象程序技术和工具的称呼,其中主要的技术是组件对象模型(COM)。在有目录和其它支持的网络中,COM变成了分布式COM(DCOM)。在创建包括ActiveX程序时,主要的工作就是组件,一个可以自足的在ActiveX网络(现在的网络主要...

  • ie浏览器java不弹窗_javacript实现不被浏览器拦截打开新窗口

    情景:1、用户发送数据到服务器2、服务器根据用户的数据生成文档3、服务器把所生成的文档的下载地址提供给用户4、用户使用的浏览器自动根据下载地址下载文件实现:网上搜索查找了下实现方式,就我查到的大多是这几种。1、直接使用window.open(); 这种方式会被浏览器拦截。2、构造表单,使用javascript进行表单提交来下载文件(设置表单的action、method、target属性)。 自...

  • ie浏览器java不弹窗_「电脑必备」锁定IE浏览器主页,防止网页广告弹窗

    杜绝网络弹窗广告相信大家对浏览器肯定都不陌生了,但是大家知道隔三差五的广告弹窗是怎么来的吗?相信大家对这些桌面的弹窗广告及桌面右下角的一些广告也整的头疼不已,那么我来告诉大家这些广告是怎么出现的,广告弹窗的罪魁祸首是来自哪里呢?广告弹窗来自于电脑上安装的第三方应用软件(例如腾讯、搜狐、网易等等...)网页广告(网页广告是平时遇到最多的一类,大家也不知道广告是从什么地方蹦出来的)今天我在这里跟大家讲...

  • ie弹不出java窗口_ie java窗口

    http://blog.csdn.net/wilsonke/article/details/38704005######jsessionid所引起的问题 在springMVC当使用RedirectView或者"redirect:"前缀来做重定向时,Spring MVC最后会调用: response.sendRedirect(response.encodeRedirectURL(url)); ...

  • java处理ie拦截弹窗_一招解决烦人的电脑广告弹窗

    现在弹窗广告是我们常见的广告模式。当我们我们进的很多网站会弹出几十个广告出来,这个也是我们非常恼火的一些网站广告模式。这些弹窗常常阻碍我们的视线,或者不小心误点击了就会进入广告模式。那么我们要如何禁止这些弹窗广告呢?1、可以浏览器设定。例如,在IE中阻击广告,主要是通过设置“工具Internet选项”中的“安全”及“高级”两个属性页中的选项来完成的,比如在安全页中选择 Internet,再点自定义...

  • word文档图标变成白纸_word文档图标变为白纸

    请不要盗用我的答案!!一号方案【新P】注意【原创】:1.安全模式下,效果更好!2. 以下所要使用的软件,都要安装或升级到最新版本,以保证使用的效果。3. 不杀毒,直接使用以下方法也可以 。若效果不好,就先在安全模式下用优质杀毒软件(如:卡巴斯基)杀一下,360安全卫士最好也用一下,之后,再用以下方法。(用360安全卫士的“杀木马”----“全盘扫描”。杀完重启。)以下方法,不一定都要用,可以一个一...

  • alert弹出[object Object],怎么进一步查看值

    如题,可以使用这个方法来获取值 var str = JSON.stringify(obj); alert(str);

  • 如何正确的打开和关闭相关Object,如 SPSite, SPWeb 等,从而避免内存资源的浪费?

     方法一:让系统自动帮你收回 using(SPSite site = new SPSite("http://moss"){   using (SPWeb web = site.OpenWeb()); {       // … do stuff with web    } // SPWeb object web.Close(), web.Displose() auto

  • ie浏览器升级_Win1020H2更新后将强行封锁ie浏览器,您能接受么?

    微软基于Chromium内核打造的新版Edge浏览器,于今年一月正式发布上线以来,市占份额持续呈现攀升趋势。截至九月底为止,数据显示,Edge浏览器市占率已来到8.84%,领先FireFox和IE浏览器。而为了推广Edge浏览器,微软不仅在官方页面放了大大的宣传栏、加速IE的淘汰,现在广告都打到Win10系统里了。从Win10 v2004版本开始,Edge被捆绑在系统里,不久前有用户反馈称,如果你...

  • IE窗口关闭事件

    IE窗口关闭,可使用window.attachEvent("onunload",function);或是:               function LeaveWin(){         alert(要关闭吗)          }          或是:    function LeaveWin(){  event.returnValue="要闭吗";  }  window.on

  • ie弹不出java小窗,IE屏蔽window.open()窗口的解决办法

    The Pop-up Blocking feature blocks pop-up (and pop-under) windows initiated automatically by a Web site. Internet Explorer blocks Pop-up windows in the Internet and Restricted sites zonesby default. H...

  • 解决【应用程序已被安全设置阻止】弹出框的手动设置方法

    在包含Applet标签的页面,运行中较高的jdk版本(例如jdk1.7或jdk1.8),会弹出【应用程序已被安全设置阻止】的安全警告框(如下图),这是由于oracle在jdk1.7(主要涉及到jdk7u21, jdk7u45, jdk7u51版本)中引入了对java浏览器插件的安全策略,以解决Applet的安全漏洞问题,具体可参看我的另一篇博文:JDK中Applet的安全性策略探究。

Global site tag (gtag.js) - Google Analytics