`
啸笑天
  • 浏览: 3462541 次
  • 性别: Icon_minigender_1
  • 来自: China
社区版块
存档分类
最新评论

JDK 7中的函数式编程思想

    博客分类:
  • news
阅读更多

关于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 

分享到:
评论

相关推荐

    jdk8函数式编程学习和复习必备

    在Java 8中,引入了Lambda表达式,使得函数式编程思想得以在Java平台上实现,极大地提高了代码的简洁性和可读性,尤其在处理大量数据集合时,其优势尤为明显。 1. **函数式编程思想** - **概念**:函数式编程关注...

    函数式编程.pdf

    函数式编程思想类似于数学中的函数,它主要关注的是对数据进行了什么操作。 1.2.2 优点 函数式编程思想可以使代码简洁、开发快速,接近自然语言,易于理解和"并发编程"。 2. Lambda表达式 Lambda表达式是JDK8...

    JDK8有一些我们最常用的新特性

    其中,Stream API、Lambda表达式以及函数式编程思想是JDK8的三大亮点,也是我们在实际项目开发中最常使用的工具。 首先,让我们深入探讨Stream API。Stream API是一种新的数据处理方式,它提供了丰富的操作集,如...

    jdk源代码src.zip

    分析Lambda表达式的内部机制,则能掌握函数式编程的精髓。 总之,"jdk8源代码src.zip"不仅是一个软件开发的实用资源,更是程序员成长的宝贵教材。通过深入研究这些源代码,开发者可以提升自己的编程技能,为日后的...

    jdk1.8-src

    JDK1.8首次引入了Lambda表达式,它是一种简洁的匿名函数表示方式,简化了对函数式接口的使用。Lambda表达式的语法形式为 `(参数列表) -&gt; 表达式或代码块`,如 `(int x, int y) -&gt; x + y`。通过这种方式,可以更方便...

    jdk5_8源码

    源码解析对于理解这些新特性的工作原理至关重要,同时也有助于开发者将函数式编程思想融入到日常开发中。 5. **查看源码的好处**: - **学习设计模式**:源码中充满了经典的设计模式,如工厂模式、单例模式、观察...

    java_jdk8源码

    - JDK8引入了Lambda表达式,这是一种简洁的匿名函数表示形式,它简化了函数式编程。源码中可以看到编译器如何将Lambda转换为Java方法接口的实例。 4. **函数式接口(Functional Interfaces)** - 如Runnable、...

    JDK8新特性

    JDK8是Java开发工具包的一个重要版本,它引入...总的来说,JDK8的Lambda表达式和函数式接口为Java开发带来了极大的便利,使得代码更加简洁、易读,同时引入了函数式编程的思想,让Java开发者能够更好地应对复杂的问题。

    hashMap基本原理,内存知识

    HashMap 基本原理、内存知识点总结 一、HashMap 基础知识 HashMap 是 Java 中最常用的 Map 实现类,因其查询...同时,Lambda 表达式和函数式接口也是 Java 中非常重要的概念,使用它们可以简洁地表达函数式编程思想。

    jdk8源码包

    JDK 8最显著的变化就是引入了Lambda表达式,这是一种简洁的函数式编程语法,使得处理集合和事件监听等场景变得更加简单。Lambda表达式可以被看作是匿名函数,可以作为参数传递,或者在没有名字的情况下定义函数。 ...

    JDK8安装包,稳定可用

    4. **函数式编程风格**:Lambda表达式引入了函数式编程思想,使得Java可以与其他现代编程语言保持同步。 总结,JDK8作为Java的一个里程碑版本,其新特性极大地提升了开发效率和代码质量。无论是初学者还是经验丰富...

    jdk1.8官网中、英文版(百度、谷歌翻译)

    2. **函数式接口**:为了支持Lambda,Java 8定义了函数式接口,如`java.util.function.Function`,`Predicate`和`Consumer`,它们只有一个抽象方法,可以被Lambda表达式隐式转换。 3. **Stream API**:Stream API是...

    JDK 1.8 64位.rar

    Lambda表达式是函数式编程思想在Java中的体现,它极大地提高了代码的可读性和可维护性。 另外,JDK 1.8还引入了Stream API,这是一个用于大量数据处理的新接口,可以对集合、数组和其他数据源进行高效且声明式的...

    java jdk 1.6 1.7 1.8 源码

    最后,JDK 1.8源码是Java语言发展的一个重要里程碑,它引入了lambda表达式和函数式编程的概念,极大地简化了多参数匿名内部类的创建。除此之外,还添加了Stream API,提供了一种新的数据处理方式,使得代码更加简洁...

    day22_JDK8新特性.pdf

    其中最引人注目的特性之一就是Lambda表达式,它是对函数式编程思想的一种实现。函数式编程强调的是“做什么”而非“怎么做”,它允许程序员更专注于业务逻辑,而非实现细节。 在传统的Java编程中,如果我们需要启动...

    jdk1.8.025 src.zip

    3. **Lambda表达式**:JDK 1.8引入了Lambda表达式,极大地简化了函数式编程。其核心在于`java.util.function`包,其中定义了一系列函数接口,如`Function`、`Predicate`和`Consumer`等。通过源码,我们可以看到...

    jdk-api-1.8.CHM Java帮助手册中文版

    1. **Lambda表达式**:允许函数式编程风格,简化多参数匿名内部类的编写。 2. **方法引用来替代Lambda**:可以使用方法名直接作为参数,无需创建匿名类。 3. **Stream API**:提供了对集合的高效处理,支持串行和...

    jdk-8u152-docs-all.rar

    其中,新特性Lambda表达式和Stream API的介绍,让开发者能更好地利用函数式编程的思想编写代码。 三、JVM和内存管理 JDK 8u152文档详细解析了Java虚拟机(JVM)的工作原理,包括类加载机制、垃圾收集器、内存模型...

    孙卫琴java面向对象编程(答案及源码)

    本书内容包括:面向对象的编程思想、Java语言的基础知识、异常处理、类与对象的生命周期、多线程、Java集合、泛型、Annotation标注、输入/输出和GUI编程,以及JDK8引入的如虎添翼的新特征,比如支持函数式编程的...

Global site tag (gtag.js) - Google Analytics