Ich gehe durch den Lambda-Ausdruck in Java 8
Wenn ich den Code des Threads geändert habe, funktioniert es gut
%Vor%wird in Lambda-Ausdruck als
konvertiert %Vor%Aber ich kann den FilenameFilter-Ausdruck
nicht konvertieren %Vor%und wurde erfolglos in
umgewandelt %Vor%es gibt Fehler wie in Eclipse als
Mehrere Marker an dieser Linie
- Syntaxfehler, Einfügen ";" Statement abschließen - Syntaxfehler, fügen Sie "}" ein, um Block zu vervollständigen - Syntaxfehler, fügen Sie "AssignmentOperator Expression" ein, um die Zuweisung zu vervollständigen
Als Erstes ist Ihre Formatierung schrecklich , sortieren Sie sie aus!
Nun, Lambda-Syntax; um die anonyme Klasse zu konvertieren:
%Vor% Wir beginnen mit dem Ersetzen der anonymen Klasse durch ein äquivalentes Lambda für die einzelne Methode accept(File dir, String name)
:
Aber wir können es besser machen, wir brauchen die Typen nicht zu definieren - der Compiler kann das erledigen:
%Vor% Und wir können es noch besser machen, da die Methode boolean
zurückgibt; Wenn wir eine einzelne Anweisung haben, die zu boolean
auswertet, können wir die return
und die geschweiften Klammern überspringen:
Dies kann eine beliebige Aussage sein, zum Beispiel:
%Vor% Allerdings ist die File
API sehr alt, also benutze sie nicht. Verwenden Sie die nio API
. Das gibt es seit Java 7 im Jahr 2011, also gibt es wirklich keine Entschuldigung:
Und tatsächlich hat Ihr Beispiel eine spezifische Methode in Files
, die nimmt ein Glob :
Oder verwenden Sie die modernere Files.list
:
Hier ist filter::matches
eine Methodenreferenz, da die Methode PathMatcher.matches
verwendet werden kann, um die funktionale Schnittstelle Predicate<Path>
zu implementieren, da sie eine Path
benötigt und eine boolean
zurückgibt.
Zur Seite:
%Vor%Das ergibt keinen Sinn ...
FileNameFilter
ist eine funktionale Schnittstelle. Sie müssen es nicht explizit instanziieren.
Beachten Sie auch, dass f
ein Verzeichnis und keine Datei wie in Ihrem Beispiel sein sollte. Ihr Beispiel, in dem f1
eine Datei ist, gibt null
mit dem angegebenen Filter zurück.