【问题标题】:Closure in Java 7 [closed]Java 7 中的闭包 [关闭]
【发布时间】:2011-07-23 13:05:09
【问题描述】:

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

【问题讨论】:

    标签: java closures


    【解决方案1】:

    闭包是一段代码,可以通过访问封闭范围的变量来引用(和传递)。

    从 Java 1.1 开始,匿名内部类以非常冗长的方式提供了这种功能。他们也有一个限制,只能使用final(和明确分配的)局部变量。 (注意,即使非final的局部变量也在作用域内,但不能使用。)

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

    Lambda 正在 Project LambdaJSR 335 下开发。

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

    【讨论】:

      【解决方案2】:

      Neal Gafter's blog 是在 Java 中引入闭包的先驱之一。他关于 2007 年 1 月 28 日关闭的帖子被命名为 A Definition of Closures 在他的博客上,有很多信息可以帮助您入门以及视频。这里有一个很棒的 Google 演讲 - Advanced Topics In Programming Languages - Closures For Java 和 Neal Gafter。

      【讨论】:

      【解决方案3】:

      根据Tom Hawtin

      闭包是一段可以被引用(并通过 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 
      

      【讨论】:

      • IMO 除了名称之外,这与闭包无关
      【解决方案4】:

      请参阅this wiki page 了解闭包的定义。

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

      也可以看看这个问答:Closures in Java 7

      【讨论】:

        【解决方案5】:

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

        Java 8 的闭包支持包括 Lambda 表达式、方法引用、构造函数引用和默认方法的概念。

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

        【讨论】:

        • 嗯,但是 Java 8 不允许修改闭包变量。好文章。
        【解决方案6】:

        是的,闭包(Lambda 表达式)是即将发布的 Java SE 8 版本的新功能。 您可以从以下链接获得更多信息: http://docs.oracle.com/javase/tutorial/java/javaOO/lambdaexpressions.html

        【讨论】:

          【解决方案7】:

          Java 5、6 和 7 的闭包实现

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

          它包含了所有可以要求的...

          【讨论】:

          • 该链接指向一些描述它的文本,但从该页面链接到的代码不存在。实施在哪里?
          • @JerryJeremiah 在这里,它现在有不同的名称,而且原来存在的所有版本都不存在(为了支持非最终访问和更多通过抽象类,它可能会再次添加为 bitbucket.org/momomo/opensource/src
          • 链接中断了!
          • 我收到 404 链接已失效
          • 链接损坏(这就是为什么我们不应该将链接作为答案...)
          猜你喜欢
          • 1970-01-01
          • 2013-10-05
          • 1970-01-01
          • 2012-07-12
          • 2013-04-28
          • 2012-12-23
          • 1970-01-01
          • 1970-01-01
          • 2015-10-28
          相关资源
          最近更新 更多