2011-05-26 161 views
19

任何人都可以描述这种类型的代码来理解Java关闭。Java关闭介绍

public static <T> void sort(List<T> l, final {T, T=>Number} block) { 

    Collections.sort(l, new Comparator<T>() { 
     public int compare(T arg0, T arg1) { 
      return block.invoke(arg0, arg1); 
     } 
    } 
} 
+19

Java 7中没有闭包。对闭包的支持已推迟到Java 8。 – axtavt 2011-05-26 10:24:00

+1

从技术上讲,内部类是闭包(它们定义可访问包含范围的标识符的函数)。 Java 7没有的优雅封闭。 – 2014-05-10 09:24:50

回答

30

重要注意事项:问题是关于较早的建议。这不是选择的语法。将此Q/A视为“历史参考”。


这句法在BGGA-proposal由吉拉德·布拉彻,尼尔Gafter,詹姆斯·高斯林,和彼得·冯·德AHE描述。

该代码段可以被描述为如下:

  1. 它需要作为第二个参数的函数取参数(T, T)和返回Number(并给它分配给参数block

  2. 然后,它从中创建一个Comparator<T>。这是通过将compare方法委托给block进行调用来实现的。

  3. 将此比较器传递给Collections.sort方法。


这里来休息的语法下来:

public static <T> void sort(List<T> l, final {T, T=>Number} block) { 
              ^^^^^^^^^^^^^^^^^^^^ 

一种说法叫block它的类型是“功能,它有两个T并返回一个Number的。

Collections.sort(l, new Comparator<T>() { 
     public int compare(T arg0, T arg1) { 
      ... 
     } 
    } 
} 

Collections.sort的普通呼叫用的Comparator作为第二个参数的匿名子类的实例...

 ... 
      return block.invoke(arg0, arg1); 
     ... 

...返回由block参数定义的函数计算出的数。


放在经典的Java而言,你的代码段将对应于像

interface Block<T> { 
    public int invoke(T arg1, T arg2); 
} 


class Test { 
    public static <T> void sort(List<T> l, final Block<T> block) { 
     Collections.sort(l, new Comparator<T>() { 
      public int compare(T arg0, T arg1) { 
       return block.invoke(arg0, arg1); 
      } 
     }); 
    } 
} 
+2

干草!它真的很好的衍生 – 2011-05-26 13:23:35

+1

不能等待在Java中有。厌倦了火灾的打瞌睡......我观察到的事件()方法。 – 2012-04-23 16:26:54

+1

想要了解lambda的最新状态,请查看http://cr.openjdk.java。净/〜briangoetz /λ/收藏-overview.html – Bringer128 2012-04-24 09:45:40

4

正如@axtavt指出的那样,Java 7(不幸的是)不会关闭。但是,Groovy的确在JVM上运行,并且与其他Java代码很好地集成在一起。我想read这是更多信息。