【问题标题】:Method File.listFiles(FilenameFilter) not applicable for Predicate方法 File.listFiles(FilenameFilter) 不适用于谓词
【发布时间】:2016-12-05 06:19:44
【问题描述】:

考虑以下代码:

File f = new File(".");
Predicate<File> notDir = (File ff) -> !ff.isDirectory();
File [] dirs = f.listFiles(notDir);
Arrays.asList(dirs).stream().forEach(System.out::println);

这会产生以下编译时错误:

File 类型中的方法 listFiles(FilenameFilter) 不是 适用于参数(谓词)

但是,以下代码可以正常工作:

File f = new File(".");
File [] dirs = f.listFiles((File ff) -> !ff.isDirectory());
Arrays.asList(dirs).stream().forEach(System.out::println);

问题:这是为什么呢?以上两个sn-ps不是等价的吗? (好吧,可能不是,所以也许正确的问题是:两者之间有什么区别?)

(备注:我知道在第二种情况下,File 类型声明可以在谓词(File ff) -&gt; !ff.isDirectory() 中省略,但我认为这与问题无关。)

【问题讨论】:

  • 如果您想使用Predicate,请使用Predicate&lt;Path&gt; notDir=p -&gt; !Files.isDirectory(p); Files.list(f.toPath()).filter(notDir).forEach(System.out::println); 或完全跳过旧版File 使用:Files.list(Paths.get("")).filter(notDir).forEach(System.out ::println);

标签: lambda java-8 predicate


【解决方案1】:

第一个 sn-p 不起作用,因为没有接受 Predicate&lt;File&gt; 作为参数的 listFiles 的重载。

第二个 sn-p 有效,因为FileFilter 是一个函数式接口,您可以通过 lambda 表达式创建一个。所以第二个sn-p其实就相当于:

FileFilter notDir = ff -> !ff.isDirectory();
File [] dirs = f.listFiles(notDir);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-06
    • 1970-01-01
    相关资源
    最近更新 更多