2016-12-05 8 views
1

Betrachten Sie den folgenden Code ein:Methode File.listFiles (Filename) nicht anwendbar für Prädikats

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

, die die folgenden Kompilierung Fehler gibt:

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

Allerdings funktioniert der folgende Code in Ordnung:

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

Frage: Warum ist das? Sind die obigen zwei Schnipsel nicht gleichwertig? (Nun, wahrscheinlich nicht, also vielleicht die richtige Frage ist: Was ist der Unterschied zwischen den beiden?)

(Bemerkung: Ich weiß, dass im zweiten Fall, die File Typ Erklärung im Prädikat (File ff) -> !ff.isDirectory() weggelassen werden könnte, aber Ich denke, das ist nicht wichtig für die Frage.)

+1

Wenn Sie eine 'Predicate' verwenden möchten, verwenden Sie' Prädikats notdir = p -> Files.isDirectory (p);! Files.list (f.toPath()). Filter (notDir) .forEach (System.out :: println); 'oder überspringe die Legacy' Datei' komplett: 'Files.list (Paths.get (" ")) .filter (notDir) .forEach (System.out :: println); ' – Holger

Antwort

4

Das erste Snippet funktioniert nicht, weil es keine Überlastung von listFiles gibt, die einen Predicate<File> als Parameter akzeptiert.

Der zweite Snippet funktioniert, weil FileFilter eine funktionale Schnittstelle ist, und Sie können eine über einen Lambda-Ausdruck erstellen. So ist der zweite Schnipsel ist eigentlich äquivalent zu:

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