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.)
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