什么是闭包

闭包是很久前看javascript相关的书时就听过的一个概念,可是一直没有理解,昨天再看groov相关的东西就对groovy的闭包特性表示不理解。

首先什么是闭包?

闭包是词法闭包(Lexical Closure)的简称,是引用了外部变量的函数。 这个被引用的外部变量将和这个函数一同存在,即使已经离开了创造它的环境也不例外。所以,有另一种说法认为闭包是由函数和与其相关的引用环境组合而成的实体。

闭包的作用和应用场景有哪些?
闭包的作用简单来说就是能够方便的调用外部变量,容易和优雅的按需创建匿名方法,减少代码量和简化操作。 应用场景适合引用环境在运行时可能发生变化时使用,若函数在定义和运行时的引用环境是相同的,则没必要使用闭包。

什么样的语言支持闭包?
1、函数可以作为一个变量的值,也可以作为另外一个函数的返回值或参数。 2、函数可以嵌套定义,即在一个函数内部可以定义另外一个函数。 3、可以捕获引用环境。并把引用环境和函数代码组成一个可调用执行的实体。 4、允许定义匿名函数。
关于闭包的一些更深入的概念,可以参考这个IBM的文章

http://www.ibm.com/developerworks/cn/linux/l-cn-closure/

不过JAVA7前貌似不支持闭包。IBM的一篇文章里给出了两周解决java闭包的方案。

其一,绰号为 “BGGA”(名字源于其作者 Gilad Bracha、Neal Gafter、James Gosling 和 Peter von der Ahe),它扩展了类型系统,引入了 function 类型。其二,绰号为 “CICE” (代表 Concise Inner Class Expressions,简洁内部类表示),是由 Joshua Bloch、Doug Lea 和 “疯狂的” Bob Lee 所支持的,其目标更谦虚:简化匿名内部类实例的创建。

具体可以参考

http://www.ibm.com/developerworks/cn/java/j-jtp04247.html

还有就是java7之后支持了简单的闭包。可以参考如下的文章

http://www.javalover.cn/html/2/73.html

接下来在本地搭建1.7的开发环境,主要就是安装JDK1.7。然后eclipse的buildpath配置一下,下面是代码,可惜没有后自行成功,但是可以看出来闭包的一些优点

	public void useInCourse(){
		List<String> list = new ArrayList();
		Collections.sort(list, #(String str1, String str2) {  
			return str1.length() - str2.length();  
		});  
		
	}
	public void useInCourse2(){
		Collections.sort(strings, #(String a, String b) a.length() - b.length());   
	}
	public void noUseInCourse(){
		List<String> list = new ArrayList();
		Collections.sort(list, new Comparator<String>() {
			public int compare(String str1, String str2) {
				return str1.length() - str2.length();
			}
		});
	}
 

总结一下。闭包是一个概念,可以再函数里引用外部的变量,很多脚本语言都支持闭包。可以java不支持闭包,JAVA7有加入简单的闭包特性。

你可能感兴趣的:(什么是闭包)