Schnelle Verwendung von FilenameFilter

1. Einleitung

Java hatte vor dem Hinzufügen der informativen Anmerkung @FunctionalInterface funktionale Schnittstellen . FilenameFilter ist eine solche Schnittstelle.

Wir werden einen kurzen Blick auf seine Verwendung werfen und verstehen, wo es heute in die Welt von Java passt.

2. DateinameFilter

Da dies eine funktionale Schnittstelle ist, müssen wir genau eine abstrakte Methode haben , und FilenameFilter folgt dieser Definition:

boolean accept(File dir, String name);

3. Verwendung

Wir verwenden FilenameFilter fast ausschließlich, um alle Dateien - die den angegebenen Filter erfüllen - in einem Verzeichnis aufzulisten .

Die überladenen Methoden list (..) und listFiles (..) in java.io.File nehmen eine Instanz von FilenameFilter und geben ein Array aller Dateien zurück, die den Filter erfüllen.

Der folgende Testfall filtert alle JSON- Dateien in einem Verzeichnis:

@Test public void whenFilteringFilesEndingWithJson_thenEqualExpectedFiles() { FilenameFilter filter = (dir, name) -> name.endsWith(".json"); String[] expectedFiles = { "people.json", "students.json" }; File directory = new File(getClass().getClassLoader() .getResource("testFolder") .getFile()); String[] actualFiles = directory.list(filter); Assert.assertArrayEquals(expectedFiles, actualFiles); }

3.1. FileFilter als BiPredicate

Oracle hat in Java 8 mehr als 40 funktionale Schnittstellen hinzugefügt. Im Gegensatz zu älteren Schnittstellen sind diese generisch. Das bedeutete, dass wir sie für jeden Referenztyp verwenden konnten.

BiPredicate war eine solche Schnittstelle. Seine einzige abstrakte Methode hat diese Definition:

boolean test(T t, U u);

Was dies bedeutet , ist , dass Filename nur ein Spezialfall ist BiPredicate wo T ist Datei und U ist String .

4. Fazit

Obwohl wir jetzt generische Predicate- und BiPredicate- Funktionsschnittstellen haben, werden wir weiterhin Vorkommen von FilenameFilter sehen, einfach weil es in vorhandenen Java-Bibliotheken verwendet wurde.

Außerdem erfüllt es seinen einzigen Zweck gut, sodass es keinen Grund gibt, es gegebenenfalls nicht zu verwenden.

Wie immer sind alle Beispiele auf GitHub verfügbar.