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

时间:2010-07-09 18:18:09

标签: 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");
                       }
                   });

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

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

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

2 个答案:

答案 0 :(得分:8)

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

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

listFiles(FileFilter)与现在相同。

你也可以写

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

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

答案 1 :(得分:0)

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