Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/339.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java闭包类型、变量、数组和集合_Java_Garbage Collection_Closures - Fatal编程技术网

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

Java闭包类型、变量、数组和集合,java,garbage-collection,closures,Java,Garbage Collection,Closures,Java闭包规范的当前状态是什么 在提议的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 aca

Java闭包规范的当前状态是什么

  • 在提议的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);
    }
    
  • 如何在接口中指定闭包类型?
    我们是否可以执行以下操作,有效地声明对方法的最终/常量引用

    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
      };
    }
    
    接口闭合
    {
    公共类Asdf
    {
    静态公共布尔gt(整数x,整数y){
    返回x>y;
    }
    静态公共布尔lt(整数x,整数y){
    返回x布尔b}[]比较开关={
    Asdf.gt、Asdf.lt、Asdf.eq
    };
    }
    
  • 既然闭包会像反射一样访问代码空间,那么闭包的使用会降低程序的性能吗?如果不是,这是否意味着,通过借鉴“闭包技术”的进步,反射会加快

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


    请您关注问题的要点,而不是示例代码中的任何语法错误/拼写错误/缺少关键字。任何拼写错误/错误,请为我更正。谢谢。

    JDK7中的闭包目前缺少详细信息。在Devxx的演示中,使用的示例与

    假设JDK7中使用了规范,那么我认为您的问题的第2、3和4部分的答案是肯定的(尽管我很可能是错的)

    对于第1部分-我认为应该可以有数组,因为方法文本可以分配给方法对象

    对于第5部分,我怀疑性能与内部类类似


    抱歉,我说得有点含糊-我希望这有点帮助。肯定地回答您的问题可能还为时尚早。

    您询问的是JDK7闭包的工作,因此对的引用不相关。该网站是关于现已完成的openjdk闭包项目,该项目展示了如何在Java中添加透明闭包满足田纳西对应原理的意义,在中作了粗略的描述

    JKD7的工作是根据规范组织的。规范正在快速发展,因此任何答案都是暂时的。正如Tom Hawtin指出的

    在回答您的具体问题之前,值得注意的是Java对变量和方法有单独的名称空间。因此,调用方法和调用函数类型的变量(用C#的说法,是委托)之间可能存在一些语法上的区别。类似地,您不太可能仅通过命名来引用方法,就像您引用字段一样

    回答您的问题:

  • 这不是建议的函数类型语法。抛开这个问题不谈,您想知道拥有函数类型数组是否合法。当前的规范草案建议答案是肯定的,但已知的实现策略将导致类型系统中出现漏洞,除非“函数类型数组”是不允许的。规范草案谨慎地避免讨论实现策略。有可能对VM规范进行更改以解决这些问题。如果我不得不猜测,我怀疑您的问题的答案将是“否”。但是,使用
    java.util.List
    而不是数组可以实现相同的效果。考虑到separate正在考虑为
    List
    添加
    集合
    文本和索引操作,这在语法上可能同样方便
  • 您想知道是否将通过命名方法来创建函数值表达式在Java中,方法和变量出现在不同的名称空间中,答案可能是否定的。但是,该规范可能会使用特定语法进行扩展,以要求将方法名称视为函数值表达式。有关可能考虑的一种方法,请参阅文档中的“方法引用”部分,使用Stephen Colebourne提出的语法。这在lambda项目的任何草案中都还没有
  • 见第(2)款的答复
  • 见第(2)款的答复
  • 您关心的是性能。简而言之,闭包不太可能使用任何技术来实现,因为这些技术会导致调用闭包的成本比调用方法高得多。出于性能原因,不需要对VM进行任何更改,尽管出于其他原因,这可能是一个好主意(请参阅对1的回答)。有关BGGA原型的指针,请参阅。BGGA是一种更为雄心勃勃的闭包规范,运行在jdk5/jdk6上,您可以测量其性能

  • 如果你们中的任何人有点太不耐烦了,不想以“不是真正的问题”来结束这个问题,请阅读我的自我评论:这不是家庭作业。50岁的古代程序员需要一些真诚的帮助才能做出一些战略决策。这是关于Neal Gafter的闭包建议的问题,还是关于Lambda的问题?当前的Lambda:Java语言规范草案0.1版本0.2正在准备中yntax类似于FCM(它使用散列字符)。实际的提案非常不同。
    // 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));
    }
    
    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
      };
    }