java 8 Lambda-Ausdruck für FilenameFilter

7

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

    
SarthAk 28.03.2015, 10:57
quelle

4 Antworten

31

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

%Vor%

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:

%Vor%

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:

%Vor%

Und tatsächlich hat Ihr Beispiel eine spezifische Methode in Files , die nimmt ein Glob :

%Vor%

Oder verwenden Sie die modernere Files.list :

%Vor%

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

    
Boris the Spider 28.03.2015, 11:09
quelle
5

Es sollte einfacher sein:

%Vor%

oder sogar:

%Vor%

Der Lambda-Ausdruck ersetzt die Instanziierung der abstrakten Klasseninstanz.

    
Eran 28.03.2015 10:59
quelle
2

Sie müssen den Klassennamen nicht angeben, wenn Sie einen Lambda-Ausdruck verwenden:

%Vor%

Tatsächlich haben Sie in Ihrem ersten Beispiel new Runnable() ausgelassen.

    
lodo 28.03.2015 10:59
quelle
2

FileNameFilter ist eine funktionale Schnittstelle. Sie müssen es nicht explizit instanziieren.

%Vor%

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.

    
T.Gounelle 28.03.2015 11:12
quelle

Tags und Links