JDK 7中的函数式编程思惟[转载]
添加时间:2013-6-28 点击量:
原文作者的概念是Lambda表达式必然会包含在JDK 7中,而全文也侧重介绍了这方面的常识,作者认为函数式编程的概念也将呈如今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]
- # Lets 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
无论对感情还是对生活,“只要甜不要苦”都是任性而孩子气的,因为我们也不完美,我们也会伤害人。正因为我们都不完美,也因为生活从不是事事如意,所以对这些“瑕疵”的收纳才让我们对生活、对他人的爱变得日益真实而具体。—— 汪冰《世界再亏欠你,也要敢于拥抱幸福》
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]
- # Lets 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