阅读更多

25顶
9踩

编程语言

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

2010-08-12 10:08 by 见习记者 jxpath 评论(35) 有14084人浏览
关于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 条 请登录后发表评论
35 楼 t173625478 2011-08-04 01:06
kjj 写道
xyqck163 写道
java 越来越垃圾了。  既然面向对象就不要搞函数式。 

你他妈才是垃圾

这么多骂人的?弱弱地问一句,函数式的优美是不是因为纯函数?
欢呼哦!众多骂人者传达给我一个信息:JDK7要摒弃变量概念了。兄弟们,Java以后不再有赋值语句咯,句句声明皆是final
34 楼 xiaor186 2010-12-21 13:49
俺暂时不关注java7了,俺做的是android,就用java5了,这个闭包开苞啥的,我看groovy时看过,很不适应,我不喜欢。
33 楼 jj0000 2010-08-16 21:54
java 7 什么时候出来   out了
32 楼 kjj 2010-08-13 20:49
xyqck163 写道
java 越来越垃圾了。  既然面向对象就不要搞函数式。 

你他妈才是垃圾
31 楼 kjj 2010-08-13 20:47
524819020 写道
常言道月满则亏,水满则溢,登高必重跌。java盛行已近百载,物极必反,java开始走下坡路啰

光在这里高谈阔论是装,会遭人鄙视的!
30 楼 sleets 2010-08-13 18:18
高阶函数是指取得或返回另一个函数的函数,在本文开头的Python代码示例中,你应该已经看到了filter函数,它就是一个高阶函数,因为它的第一个参数是一个函数,这个函数用于测试列表(第二个参数)中每个元素的内容。

这逻辑太严密了。。。
29 楼 moonranger 2010-08-13 17:55
不需要到多么FP的地步,简简单单的闭包,让我省去code里的一堆内部类就足够了……
不过期待了很久的yield还是没有加到Java里……
28 楼 524819020 2010-08-13 16:51
常言道月满则亏,水满则溢,登高必重跌。java盛行已近百载,物极必反,java开始走下坡路啰
27 楼 icanfly 2010-08-13 16:19
lxl214686623 写道
runshine 写道
我需要的是更灵活更健壮的并发
需要的是更迅捷更快速的同异步IO
期待的是能够使用比TCPUDP更底层的通讯协议
需要的是控件更丰富操作更流畅的swing更优美的L&F

只是为了少几行代码引入风格大相径庭的Lambda,闭包有意义吗
也就函数类型值得看看,函数指针、委托?

地道,实在 

+1
26 楼 volking 2010-08-13 15:02
越来越复杂还叫java?不如大家一起学c++好了
25 楼 InnocentBoy 2010-08-13 14:38
原来java处于衰退期,不知道在oracle手里能如何发展!
24 楼 netfishx 2010-08-13 13:20
dabian_guo 写道
ray_linn 写道
C#, groovy都有的东西,Java现在才有。。。诶,落后啊


实施上没有这些乱七八糟的所谓先进语言的特性,JAVA也不比任何语言落后。你让C# groovy情何以堪啊

事实上,java从没有对c#在语言特性上的领先。落后就是落后,不是不承认就能改变的
23 楼 maku 2010-08-13 13:14
一门小众语言,添加一些新特性无可厚非,但是作为全球众多人使用的语言,在团队开发中就不好控
lxl214686623 写道
runshine 写道
我需要的是更灵活更健壮的并发
需要的是更迅捷更快速的同异步IO
期待的是能够使用比TCPUDP更底层的通讯协议
需要的是控件更丰富操作更流畅的swing更优美的L&F

只是为了少几行代码引入风格大相径庭的Lambda,闭包有意义吗
也就函数类型值得看看,函数指针、委托?

地道,实在 

没错,我们要的是方便于解决问题的功能,而不是技巧。
22 楼 lxl214686623 2010-08-13 12:52
runshine 写道
我需要的是更灵活更健壮的并发
需要的是更迅捷更快速的同异步IO
期待的是能够使用比TCPUDP更底层的通讯协议
需要的是控件更丰富操作更流畅的swing更优美的L&F

只是为了少几行代码引入风格大相径庭的Lambda,闭包有意义吗
也就函数类型值得看看,函数指针、委托?

地道,实在 
21 楼 HeDYn 2010-08-13 12:31
我需要的是更灵活更健壮的并发
需要的是更迅捷更快速的同异步IO
期待的是能够使用比TCPUDP更底层的通讯协议
需要的是控件更丰富操作更流畅的swing更优美的L&F

只是为了少几行代码引入风格大相径庭的Lambda,闭包有意义吗
也就函数类型值得看看,函数指针、委托?[/q uote]
20 楼 maku 2010-08-13 10:45
作为一门小众语言,添加一些新特性无可厚非,但是作为全球众多人使用的语言,在团队开发中就不好控制了。
19 楼 AllenZhang 2010-08-13 10:38
以oo的思想做接口和层次面级别的设计,以函数的思想做逻辑算法的实现。完美的组合。
18 楼 exe 2010-08-13 10:37
越搞越复杂,1.4的语法就够了。以后是不是还要加指针近来呀?
17 楼 runshine 2010-08-13 10:27
我需要的是更灵活更健壮的并发
需要的是更迅捷更快速的同异步IO
期待的是能够使用比TCPUDP更底层的通讯协议
需要的是控件更丰富操作更流畅的swing更优美的L&F

只是为了少几行代码引入风格大相径庭的Lambda,闭包有意义吗
也就函数类型值得看看,函数指针、委托?
16 楼 joeyhacker 2010-08-13 10:16
xyqck163 写道
java 越来越垃圾了。  既然面向对象就不要搞函数式。 

中国就TMD这种人多, 自己明明不行, 别人有点什么玩意就这个那个的,你行你弄出来啥了?CAO, 老老实实挣点钱得了, 逼我这样没素质的和你们说话。

发表评论

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

相关推荐

  • 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