2016-12-05 110 views
1

考慮下面的代碼:方法File.listFiles(的FilenameFilter)不適用於謂詞

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

其中給出以下編譯時錯誤:

The method listFiles(FilenameFilter) in the type File is not applicable for the arguments (Predicate)

但是,下面的代碼工作正常:

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

問題:這是爲什麼?上述兩個片段是否相同? (好吧,可能不是,所以也許是正確的問題是:兩者有什麼區別?)

(備註:我知道在第二種情況下,File類型聲明可以在謂詞(File ff) -> !ff.isDirectory()中被省略,但是我認爲這個問題並不重要。)

+1

,使用'謂詞 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);' – Holger

回答

4

第一個片段不起作用,因爲listFiles沒有超載,它接受Predicate<File>作爲參數。

第二個片段工作,因爲FileFilter是一個功能界面,你可以通過創建一個lambda表達式之一。如果你想使用`Predicate`

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