Java闭包类型,变量,数组和集合

Ble*_*eek 11 java closures garbage-collection

Java闭包的当前规范是什么?

  1. 在提议的Java闭包规范中,我们能够创建一个数组或闭包集合吗?
    如果是这样,这种语法是否可行?

    {int x, int y => boolean b}[] comparisonSwitch = {
      {int i, int j => return i>j},
      {int i, int j => return j<i},
      {int i, int j => return j==i}
    }
    
    boolean compare(int acase, int a, int b){
      return comparisonSwitch[acase].invoke(a,b);
    }
    
    Run Code Online (Sandbox Code Playgroud)
  2. 普通方法会被视为非匿名闭包吗?
    那么以下语法是否可行?

    public class Asdf
    {
      public boolean gt(int x, int y){
        return x>y;
      }
      public boolean lt(int x, int y){
        return x<y;
      }
      public boolean eq(int x, int y){
        return x==y;
      }
    
      {int x, int y => boolean b} GT = gt;
      {int x, int y => boolean b}[] comparisonSwitch = {
        gt, lt, eq
      }
    }
    
    Run Code Online (Sandbox Code Playgroud)
  3. 即,闭包和方法是否可以互换?
    是否允许以下​​语法?

    // declare a method that has a closure type as an argument
    void closurator( {String s => int a} findlen ){
      // do whatever
    }
    String s = "hello";
    void useClosurator(){
      // invoke the method by supplying a non-anonymous method
      // of an object
      closurator(s.indexOf(String ss));
    }
    
    Run Code Online (Sandbox Code Playgroud)
  4. 我们如何能够在接口中指定闭包类型?
    我们能否做到以下几点,有效地声明对方法的最终/常量引用.

    interface Closuration
    {
      public class Asdf
      {
        static public boolean gt(int x, int y){
          return x>y;
        }
        static public boolean lt(int x, int y){
          return x<y;
        }
        static public boolean eq(int x, int y){
          return x==y;
        }
      }
    
      {int x, int y => boolean b}[] comparisonSwitch = {
        Asdf.gt, Asdf.lt, Asdf.eq
      };
    }
    
    Run Code Online (Sandbox Code Playgroud)
  5. 由于闭包会访问代码空间,就像反射一样,使用闭包会降低程序的性能吗?如果不是,这意味着,通过借用"封闭技术"的进步来加速反思吗?

插入新问题:实际上,闭包代码是代码空间的一部分还是变量堆中的一部分,因为我预测闭包代码很容易被垃圾收集擦掉,对吧?

我可以请求您关注问题的要点,而不是示例代码中的任何语法错误/拼写错误/缺失关键字.任何错别字/错误,请为我纠正.谢谢.

Nea*_*ter 12

您询问JDK7闭包是否有效,因此对javac.info的引用无关紧要.该网站是关于现已完成的openjdk闭包项目,该项目展示了如何向Java 添加透明闭包 - 在满足Tennent的通信原则的意义上的透明度,并在我的博客中大致描述.

JKD7的工作是在openjdk lambda项目下组织的.规范正在快速发展,所以任何答案都是试探性的.正如Tom Hawtin所指出的,这是最新的草案规范.

在回答您的具体问题之前,值得观察的是Java具有用于变量和方法的单独命名空间.因此,在调用方法和调用函数类型的变量(在C#parlance中,委托)之间可能存在一些语法上的区别.同样,您不太可能通过命名方法来引用方法,就像引用字段一样.

回答你的问题:

  1. 这不是函数类型的建议语法.抛开这个问题,你想知道拥有一个函数类型数组是否合法.当前的规范草案表明答案是肯定的,但是已知的实现策略会导致类型系统出现漏洞,除非"函数类型数组"以某种方式被禁止.规范草案小心避免讨论实施策略.可能会对VM规范进行更改以解决这些问题.如果我不得不猜测,我怀疑你问题的答案是"不".但是,您可以使用java.util.List而不是使用数组来实现相同的效果.鉴于Coin正在考虑单独的项目添加Collection文字和索引操作List,它可能在语法上方便.
  2. 您想知道是否要通过命名方法来创建函数值表达式.因为(除其他原因)方法和变量出现在Java的不同命名空间中,答案可能是否定的.但是,可能会使用特定语法扩展规范,以便将方法名称视为函数值表达式.请参阅文档Closures for Java(v0.6a)中的方法参考一节,了解可能考虑的一种方法,使用Stephen Colebourne提出的语法.这还没有在lambda项目的任何草案中.
  3. 见(2)的答案.
  4. 见(2)的答案.
  5. 你关心的是表现.简而言之,闭包不可能通过任何技术实现,使得它们比方法更昂贵.出于性能原因,不需要更改VM,但出于其他原因可能是个好主意(请参阅答案1).请参阅Closures Project主页,获取指向BGGA原型的指针,这是一个更加雄心勃勃的闭包规范,在jdk5/jdk6库存上运行,您可以测量其性能.