JDK 7中的函数式编程思想

原创
开发 后端 新闻
原文作者的观点是Lambda表达式一定会包含在JDK 7中,而全文也着重介绍了这方面的知识,作者认为函数式编程的概念也将出现在JDK 7中。

【51CTO外电头条】关于JDK 7有太多让人激动和兴奋的新特性,特别是Lambda表达式!如果你在搜索引擎中搜索JDK 7,你将会看到很多有关Lambda表达式的讨论,一直以来它都是一个有争议的话题,这也表明它受到了很多的关注,但也正因为如此,它的发展脚步放缓了,并增加了决策的难度。

51CTO推荐阅读:再探Java 7:***特性更新、代码示例及性能测试

我的观点是Lambda表达式一定会包含在JDK 7中,你可以从网上或快照生成中看到大量的迹象。本文是为那些尚不了解函数式编程,或不知道Lambda表达式,闭包或局部套用函数是什么的人而写的。

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. # Let's 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

【编辑推荐】

  1. 浅谈Java 7的闭包与Lambda表达式之优劣
  2. 探秘JDK 7:将会出现新的语言特性
  3. 为什么大家都觉得函数式编程将会流行?
  4. 对象函数式编程 Scala简史
  5. TechED 09视频专访:F#与函数式编程语言
责任编辑:王晓东 来源: 51CTO
相关推荐

2011-10-19 15:47:13

2010-06-22 13:32:26

函数式编程JavaScript

2017-10-17 16:23:58

函数式编程ReduxReact

2020-09-23 16:07:52

JavaScript函数柯里化

2013-09-09 09:41:34

2020-02-06 19:12:36

Java函数式编程编程语言

2012-09-21 09:21:44

函数式编程函数式语言编程

2011-12-27 10:17:56

JDKJava

2023-10-07 00:01:02

Java函数

2011-08-24 09:13:40

编程

2023-12-14 15:31:43

函数式编程python编程

2022-09-22 08:19:26

WebFlux函数式编程

2013-03-04 10:03:17

Python函数式编程

2017-03-22 11:22:04

JavaScript函数式编程

2013-03-04 09:47:08

Python函数式编程

2013-03-05 10:01:29

Python函数式编程

2017-06-08 14:25:46

Kotlin函数

2011-03-08 15:47:32

函数式编程

2016-10-31 20:46:22

函数式编程Javascript

2020-09-24 10:57:12

编程函数式前端
点赞
收藏

51CTO技术栈公众号