Java中的闭包将如何替换/扩充接口?

Java中的闭包将如何替换/扩充接口?,java,closures,java-7,Java,Closures,Java 7,Java7将有闭包(最后),我想知道现在如何使用使用使用单一方法类/接口(如Runnable、Comparator等)的现有代码 那个代码会被替换吗?会是某种形式的转换吗?将添加使用闭包的额外方法 有人知道这将如何运作/计划是什么吗 例如,今天要使用FileFilter,我们需要: .... File [] files = directory.listFiles( new FileFilter() public boolean accept( Fil

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

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

有人知道这将如何运作/计划是什么吗

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

....
File [] files = directory.listFiles( new FileFilter() 
                      public boolean accept( File file ) {
                          return file.getName().endsWith(".java");
                       }
                   });
有人知道Java7将如何工作吗

可能是重载File.listFiles方法以接收闭包

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

这些类/接口称为SAM(单一抽象方法)类型,将lambda转换为SAM类型是JDK7项目lambda提案的核心部分。事实上,提案的最新迭代删除了函数类型,只允许lambda作为SAM类型的实例。使用最新版本的语法(不是final),您的示例可以编写为:

File[] files = directory.listFiles(#(file){file.getName().endsWith(".java")});
使用
listFiles(FileFilter)

你也可以写

FileFilter javaFileFilter = {#(file){file.getName().endsWith(".java")};

您可能还想看看此文档,它是提案的最新更新,并对内容进行了更详细的解释。还请注意,所有细节都可能发生更改,尽管很确定lambda表达式/块将可用作SAM类型,如我所述。

现有代码不受影响,也不需要更换。

参见此article@Bozho这已经过时了,因为它没有引用提案的当前版本,它没有函数类型。
#x(y){return z;}
已经被推送到JDK7,这是否意味着他们将在当前的lambda之上添加这些lambda,或者完全删除
#
东西?SAM转换很好,它允许Java环境的大部分自动关闭。我喜欢
#int(inty){return z;}
{y->z}
更好语法不是最终的,所以它可以再次更改,甚至回到
#
的东西。我觉得很多人都不喜欢这样。在新版本的建议中,一件很好的事情是lambda参数的类型推断,即
{y->z}
而不是
{int y->z}
。此外,lambda仍然可以是块而不是表达式,因此您当然可以编写
{y->return z;}
,可以方便地排除
返回
当你只需要一个表达式时(我认为这是相当常见的)。事实上,这个建议要求你编写
{y->yield z;}
,而不是使用
return
,希望保存
return
以获得“长返回”(从lambda的作用域中的方法返回)。似乎大多数人都不赞成使用
yield