如何通过Java中的闭包来替换/扩充接口?

Osc*_*Ryz 11 java closures java-7

Java 7将有闭包(最后),我想知道现在如何使用单个方法类/接口(如Runnable,Comparator等)的现有代码.

该代码会被替换吗?将是某种转换?将添加使用闭包的额外方法?

有谁知道这是如何工作/计划是什么?

例如,今天要使用FileFilter,我们可以:

....
File [] files = directory.listFiles( new FileFilter() 
                      public boolean accept( File file ) {
                          return file.getName().endsWith(".java");
                       }
                   });
Run Code Online (Sandbox Code Playgroud)

有谁知道这对Java7有什么用?

也许重载方法File.listFiles来接收一个闭包?

File [] files = directory.listFiles(#(File file){
                    return file.getName().endsWith(".java");
                 });
Run Code Online (Sandbox Code Playgroud)

Col*_*inD 8

这些类/接口称为SAM(单一抽象方法)类型,lambdas到SAM类型的转换是JDK7项目lambda建议的核心部分.事实上,最新的提议迭代会删除函数类型,并且允许lambdas作为SAM类型的实例.使用最新版本的语法(不是最终版本),您的示例可以写成:

File[] files = directory.listFiles(#(file){file.getName().endsWith(".java")});
Run Code Online (Sandbox Code Playgroud)

与现在listFiles(FileFilter)不变.

你也可以写

FileFilter javaFileFilter = {#(file){file.getName().endsWith(".java")};
Run Code Online (Sandbox Code Playgroud)

您可能还想查看Lambda文档的状态,这是该提案的最新更新,并更详细地解释了一些内容.另请注意,细节都可能会发生变化,但很可能确定lambda表达式/块可以像我所描述的那样用作SAM类型.