【发布时间】: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) -> !ff.isDirectory() 中省略,但我认为这与问题无关。)
【问题讨论】:
-
如果您想使用
Predicate,请使用Predicate<Path> notDir=p -> !Files.isDirectory(p); Files.list(f.toPath()).filter(notDir).forEach(System.out::println);或完全跳过旧版File使用:Files.list(Paths.get("")).filter(notDir).forEach(System.out ::println);