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