在Java 7中closures

什么是closures? 它应该被包含在Java 7中。 (闭包讨论了包含在Java 7中,但最终没有包括在内。)任何人都可以请我提供一些可靠的参考,从哪里我可以学习关于闭包的东西?

这里是Neal Gafter博客介绍Java中的闭包的先驱之一。 他在2007年1月28日closures的post被命名为closures的定义在他的博客上有很多信息可以让你开始以及video。 这里有一个很棒的Google谈话 – 编程语言高级话题 – Neal Gafter的Java闭包 。

闭包是一段代码,可以通过访问封闭作用域的variables来引用(并传递)。

从Java 1.1开始,匿名内部类就以非常冗长的方式提供了这个function。 他们也有限制,只能使用final (和明确的)局部variables。 (注意,即使非final局部variables在范围内,但不能使用。)

Java SE 8旨在为单一方法接口*提供更简洁的版本,称为“lambdas”。 Lambdas和匿名内部类有很多相同的限制,尽pipe一些细节随机变化。

Lambda正在根据Lambda项目和JSR 335进行开发。

*最初devise更灵活,允许使用单一抽象方法(SAM)types。 不幸的是,新devise不够灵活,但是试图certificate允许在接口中实现。

请参阅这个wiki页面 ,了解closures的定义。

这个页面在Java 8中closures: http : //mail.openjdk.java.net/pipermail/lambda-dev/2011-September/003936.html

也请看这个问题: Java 7中的闭包

汤姆霍金说

闭包是一段代码,可以通过访问封闭作用域的variables来引用(并传递)。

现在我试图模仿维基百科上的JavaScriptclosures示例,以“ straigth ”转换为Java,希望能够有用:

 //ECMAScript var f, g; function foo() { var x = 0; f = function() { return ++x; }; g = function() { return --x; }; x = 1; print('inside foo, call to f(): ' + f()); // "2" } foo(); print('call to g(): ' + g()); // "1" print('call to f(): ' + f()); // "2" 

现在,java部分:Function1是arity 1(一个参数)的“Functor”接口。 Closure是实现Function1的类,它是一个函数(int – > int)的函数。 在main()方法中,我只是将foo实例化为Closure对象,并复制JavaScript示例中的调用。 IntBox类只是一个简单的容器,它的行为就像一个1 int的数组:

  int a [1] = {0} 
 interface Function1 { public final IntBag value = new IntBag(); public int apply(); } class Closure implements Function1 { private IntBag x = value; Function1 f; Function1 g; @Override public int apply() { // print('inside foo, call to f(): ' + f()); // "2" // inside apply, call to f.apply() System.out.println("inside foo, call to f.apply(): " + f.apply()); return 0; } public Closure() { f = new Function1() { @Override public int apply() { x.add(1); return x.get(); } }; g = new Function1() { @Override public int apply() { x.add(-1); return x.get(); } }; // x = 1; x.set(1); } } public class ClosureTest { public static void main(String[] args) { // foo() Closure foo = new Closure(); foo.apply(); // print('call to g(): ' + g()); // "1" System.out.println("call to foo.g.apply(): " + foo.g.apply()); // print('call to f(): ' + f()); // "2" System.out.println("call to foo.f.apply(): " + foo.f.apply()); } } 

它打印:

 inside foo, call to f.apply(): 2 call to foo.g.apply(): 1 call to foo.f.apply(): 2 

Java闭包将成为J2SE 8的一部分,并将于2012年底发布。

Java 8的闭包支持包括Lambdaexpression式,方法参考,构造函数参考和缺省方法的概念。

欲了解更多信息和工作示例请访问: http : //amitrp.blogspot.in/2012/08/at-first-sight-with-closures-in-java.html

Java 5,6和7的闭包实现

http://mseifed.blogspot.se/2012/09/bringing-closures-to-java-5-6-and-7.html

它包含所有人可以要求…

是的,Closure(Lambdaexpression式)是即将推出的Java SE 8版本的新function。 你可以从下面的链接获得更多的信息: http : //docs.oracle.com/javase/tutorial/java/javaOO/lambdaexpressions.html