JDK 7中的函数式编程思想[转载]
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
原文地址:http://java.dzone.com/articles/lambdas-closures-jdk-7
JDK 7中的函数式编程思想[转载]的更多相关文章
- Apache Beam中的函数式编程理念
不多说,直接上干货! Apache Beam中的函数式编程理念 Apache Beam的编程范式借鉴了函数式编程的概念,从工程和实现角度向命令式妥协. 编程的领域里有三大流派:函数式.命令式.逻辑式. ...
- C#中面向对象编程中的函数式编程详解
介绍 使用函数式编程来丰富面向对象编程的想法是陈旧的.将函数编程功能添加到面向对象的语言中会带来面向对象编程设计的好处. 一些旧的和不太老的语言,具有函数式编程和面向对象的编程: 例如,Smallta ...
- Scala 函数式编程思想
Spark 选择 Scala 作为开发语言 在 Spark 诞生之初,就有人诟病为什么 AMP 实验室选了一个如此小众的语言 - Scala,很多人还将原因归结为学院派的高冷,但后来事实证明,选择 S ...
- 函数式编程思想概述和冗余的Runnable代码
函数式编程思想概述 在数学中,函数就是有输入量.输出量的一套计算方法 相对而言,面向对象过分强调必须通过对象的形式来做事情,而函数式的思想是尽量忽略复杂的面向对象的复杂语法--是强调做什么而不是以什么 ...
- 可爱的 Python : Python中的函数式编程,第三部分
英文原文:Charming Python: Functional programming in Python, Part 3,翻译:开源中国 摘要: 作者David Mertz在其文章<可爱的 ...
- Java 中的函数式编程(Functional Programming):Lambda 初识
Java 8 发布带来的一个主要特性就是对函数式编程的支持. 而 Lambda 表达式就是一个新的并且很重要的一个概念. 它提供了一个简单并且很简洁的编码方式. 首先从几个简单的 Lambda 表达式 ...
- C#中的函数式编程:序言(一)
学了那么久的函数式编程语言,一直想写一些相关的文章.经过一段时间的考虑,我决定开这个坑. 至于为什么选择C#,在我看来,编程语言分三类:一类是难以进行函数式编程的语言,这类语言包括Java6.C语言等 ...
- (数据科学学习手札48)Scala中的函数式编程
一.简介 Scala作为一门函数式编程与面向对象完美结合的语言,函数式编程部分也有其独到之处,本文就将针对Scala中关于函数式编程的一些常用基本内容进行介绍: 二.在Scala中定义函数 2.1 定 ...
- C#中的函数式编程:递归与纯函数(二) 学习ASP.NET Core Razor 编程系列四——Asp.Net Core Razor列表模板页面
C#中的函数式编程:递归与纯函数(二) 在序言中,我们提到函数式编程的两大特征:无副作用.函数是第一公民.现在,我们先来深入第一个特征:无副作用. 无副作用是通过引用透明(Referential ...
随机推荐
- HDU-4255
A Famous Grid Time Limit: 10000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)To ...
- Django 1.6在Windows平台下的配置
Django 1.6 在Windows平台下的配置 前言 最近两天研究了下Django1.6在Windows平台中的配置安装,服务器采用Apache.期间遇到过许多新手所遇到的各种问题,也算是一种宝贵 ...
- .net 杂项
vs 打印信息到输出窗口 : System.Diagnostics.Debug.WriteLine("打印信息到输出窗口,但是只能在Debug版本运行,到了release版本中,Debug类 ...
- nodejs里的express自动刷新gulp-express使用【转载】
搬运自[http://blog.csdn.net/zhu_free/article/details/51476525] gulp-express实现实时刷新 本来使用gulp-connect可以创建本 ...
- loadrunner中文件的操作
loadrunner中文件的操作 我们可以使用fopen().fscanf().fprintf().fclose()函数进行文件操作,但是因为LoadRunner不支持FILE数据类型,所以我们需要做 ...
- Ubuntu 虚拟机增强包下载
https://www.virtualbox.org/wiki/Download_Old_Builds_5_1 Extension Pack All Platforms 安装方法详情:https:// ...
- Python与SQLite日期时间函数的使法
SQLite的时间函数跟Python的时间函数有些许差别,所以稍做记录,供自己以后查询. 网上有将SQLite官方WIKI内容翻译成中文的文章,大家有兴趣可以搜索一下,我这里单纯记录一下个人比较常用的 ...
- Python 一条语句如何在多行显示的问题
在做python学习的时候,我照着pdf,敲代码,遇到一大难题: return render_to_response('index.html',{'title':'my page','user':us ...
- socket编程(TCP)
1.模型:(图片来自百度百科) 服务端: 1)创建socket对象 int socket(int domain, int type, int protocol) domain:即协议域,又称为协议族( ...
- javascript中的this总结
1.关于this 我们需要根据 "调用位置" 上函数的 "调用方式" 来确定函数中this使用的 "绑定规则" 2.绑定规则 非严格模式下: ...