Java 7中的闭包


105

什么是封包?它应该被包含在Java 7中(闭包包含在Java 7中进行了讨论,但最终并没有包括在内。-ed)谁能请我提供我从哪里可以了解闭包的东西一些可靠的参考?

Answers:


59

这是Neal Gafter的博客,他介绍Java闭包的先驱之一。他于2007年1月28日发表的关于封闭的文章名为“封闭的定义”。在他的博客上,有很多信息可以帮助您入门和学习视频。这里是Google的精彩演讲- 编程语言高级主题 -Neal Gafter的Java闭包


2
您有比整个博客更具体的链接吗?
I82Much


1
如果有人是哑巴和我一样,如果你击败你的头靠在墙上只知道黑客是什么这个封闭....然后在这里你去.. youtube.com/watch?v=Nj3_DMUXEbE
的Piyush Kukadiya

我无法想象用最初没有闭包的语言来实现闭包。.kinda疯狂
Alexander Mills

亚历山大·米尔斯(Alexander Mills)只是好奇..为什么?
Bartzilla '19

84

闭包是可以访问(并传递)访问封装范围变量的代码块。

从Java 1.1开始,匿名内部类以高度冗长的方式提供了此功能。它们还具有只能使用final(并明确分配)局部变量的限制。(请注意,即使非final局部变量也在范围内,但不能使用。)

Java SE 8旨在针对单方法接口*提供更简洁的版本,称为“ lambdas”。Lambda与匿名内部类具有相同的限制,尽管某些细节随机变化。

Lambda 项目Lambda项目正在开发中 JSR 335

*最初,该设计更加灵活,允许使用单一抽象方法(SAM)类型。不幸的是,新设计的灵活性较差,但确实试图证明允许在接口内实施。


7

根据汤姆·霍顿Tom Hawtin)的说法

闭包是可以访问(并传递)访问封装范围变量的代码块。

现在,我试图在Wikipedia上模拟JavaScript闭包示例,并向Java 进行“ straigth ”翻译,以期有所帮助:

//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的类,Function1是充当函数的具体函子(int-> int)。在main()方法中,我只是将foo实例化为Closure对象,复制来自JavaScript示例的调用。IntBox类只是一个简单的容器,其行为类似于1个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 

2
IMO除了这个名字与闭包无关
-n00b




0

Java 5、6和7的闭包实现

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

它包含了所有可能要求...


该链接指向描述它的一些文本,但是从该页面链接到的代码不存在。实施在哪里?
杰里·耶利米

@JerryJeremiah在这里,它现在有了不同的名称,也不存在最初提供的所有版本(为了支持非最终访问以及通过抽象类的更多支持,可能会在<Java 8版本中再次添加它,您使用的是什么平台寻找?):bitbucket.org/momomo/opensource/src
mmm

2
链接断开!
sunleo

我收到404链接已失效
Alexander Mills

链接断开(这就是为什么我们不应该将链接作为答案...的原因)
OhadR
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.