JDK 7中的函数式编程思惟[转载]

    添加时间:2013-6-28 点击量:
    原文作者的概念是Lambda表达式必然会包含在JDK 7中,而全文也侧重介绍了这方面的常识,作者认为函数式编程的概念也将呈如今JDK 7中.



    Lambda表达式


    Lambda表达式并不是什么新概念,自Alonzo Church提出Lambda微积分的概念以来,已经有30个年初了,从那时开端,它们就成为很多函数式编程说话的首要特点,最凸起的可能要算Lisp,如今Lambda表达式已经跻身于函数式编程说话的一等公民。Lambda表达式是一个匿名函数,为了演示,这里有一个段你可能经常看到的Python代码段:



    1. list = [1, 2, 3, 6, 8,]  

    2. print filter(Lambda x: x  2 > 10, list)  

    3. [6, 8] 


    表达式Lambda x: x 2 > 10是一个Lambda函数,在运行时它是匿名的,在filter函数中履行,类似地,你可以将雷同的表达式赋给一个变量进行传递,或调用函数自身:



    1. f = Lambda x: x  2 > 10  

    2. print filter(f, list)  

    3. [6, 8]  

    4. # Lets call f itself  

    5. f(1)  

    6. False 


    在Java中,我们今朝有匿名内部类证实Lambda表达式是匿名的,当传递给它一个办法时,它们就是一个通俗的对象,如:



    1. File cwd = new File(.);  

    2. System.out.println(cwd.list(new FileFilter() {  

    3.     public boolean accept(File f) {  

    4.         return f != null && f.getName().endsWith(.java);  

    5.     }  

    6. })); 


    如今可以将Lambda表达式简单地算作一个匿名函数,在Java中,这可能意味着“回调”,真正的递归和其它功能,或许实现Comparator(斗劲器)接口筛选凑集的日子将一去不复还了,若是它们在JDK 7中完成,估计我们将看到一个加倍动态的说话。


    函数类型


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


    闭包


    你应当据说过闭包的概念,它是另一个很是简单的函数式编程概念,它容许在一个函数中包含另一个函数,并可以在内部函数中引用外部变量,这种变量被称作“变量”,因为它们不是闭包的参数,也不是局部变量。


    实际上,若是你浏览过有关JDK 7的文章,你会发明闭包一词的呈现频率比Lambda表达式还要多,这是因为它俩凡是是一路呈现的,当Lambda表达式接见外部变量时,它就变成闭包,按照定义,闭包也是一种Lambda表达式。


    高阶函数


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


    局部套用函数


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



    1. // mul is function that takes two arguments; both ints  

    2. 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



    无论对感情还是对生活,“只要甜不要苦”都是任性而孩子气的,因为我们也不完美,我们也会伤害人。正因为我们都不完美,也因为生活从不是事事如意,所以对这些“瑕疵”的收纳才让我们对生活、对他人的爱变得日益真实而具体。—— 汪冰《世界再亏欠你,也要敢于拥抱幸福》
    分享到: