【发布时间】:2011-07-23 13:05:09
【问题描述】:
什么是闭包?它应该包含在 Java 7 中。(讨论了包含在 Java 7 中的闭包,但最终没有被包含在内。-ed)任何人都可以向我提供一些可靠的参考资料。可以学习关于闭包的东西吗?
【问题讨论】:
什么是闭包?它应该包含在 Java 7 中。(讨论了包含在 Java 7 中的闭包,但最终没有被包含在内。-ed)任何人都可以向我提供一些可靠的参考资料。可以学习关于闭包的东西吗?
【问题讨论】:
闭包是一段代码,可以通过访问封闭范围的变量来引用(和传递)。
从 Java 1.1 开始,匿名内部类以非常冗长的方式提供了这种功能。他们也有一个限制,只能使用final(和明确分配的)局部变量。 (注意,即使非final的局部变量也在作用域内,但不能使用。)
Java SE 8 旨在为单方法接口*提供一个更简洁的版本,称为“lambdas”。 Lambda 与匿名内部类有很多相同的限制,尽管有些细节是随机变化的。
Lambda 正在 Project Lambda 和 JSR 335 下开发。
*最初的设计更加灵活,允许使用单一抽象方法 (SAM) 类型。不幸的是,新设计不太灵活,但确实试图证明允许在接口内实现是合理的。
【讨论】:
Neal Gafter's blog 是在 Java 中引入闭包的先驱之一。他关于 2007 年 1 月 28 日关闭的帖子被命名为 A Definition of Closures 在他的博客上,有很多信息可以帮助您入门以及视频。这里有一个很棒的 Google 演讲 - Advanced Topics In Programming Languages - Closures For Java 和 Neal Gafter。
【讨论】:
闭包是一段可以被引用(并通过 around) 可以访问封闭范围的变量。
现在我正在尝试模拟 Wikipedia 上的 JavaScript 闭包示例,并将“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”接口。闭包是实现 Function1 的类,这是一个充当函数 (int -> int) 的具体 Functor。 在 main() 方法中,我只是将 foo 实例化为闭包对象,复制 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
【讨论】:
请参阅this wiki page 了解闭包的定义。
这个页面在 Java 8 中关闭:http://mail.openjdk.java.net/pipermail/lambda-dev/2011-September/003936.html
也可以看看这个问答:Closures in Java 7
【讨论】:
Java Closures 将成为 J2SE 8 的一部分,并将于 2012 年底发布。
Java 8 的闭包支持包括 Lambda 表达式、方法引用、构造函数引用和默认方法的概念。
有关更多信息和工作示例,请访问:http://amitrp.blogspot.in/2012/08/at-first-sight-with-closures-in-java.html
【讨论】:
是的,闭包(Lambda 表达式)是即将发布的 Java SE 8 版本的新功能。 您可以从以下链接获得更多信息: http://docs.oracle.com/javase/tutorial/java/javaOO/lambdaexpressions.html
【讨论】:
Java 5、6 和 7 的闭包实现
http://mseifed.blogspot.se/2012/09/bringing-closures-to-java-5-6-and-7.html
它包含了所有可以要求的...
【讨论】: