Schnelle Verwendung von FilenameFilter
1. Einführung
Java hattefunctional interfaces vor dem Hinzufügen der informativen Annotation@FunctionalInterface. 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. FilenameFilter
Dathis is a functional interface – we have to have exactly one abstract method undFilenameFilter dieser Definition folgen:
boolean accept(File dir, String name);
3. Verwendungszweck
Wir verwendenFilenameFilter fast ausschließlich, um alle Dateien - die den angegebenen Filter erfüllen - in einem Verzeichnis aufzulisten.
Die überladenen Methodenlist(..) undlistFiles(..) injava.io.File nehmen eine Instanz vonFilenameFilter und gebenarray aller Dateien zurück, die den Filter erfüllen.
Der folgende Testfall filtert allejson-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 alsBiPredicate
Oracle hat in Java 8 mehr als 40 Funktionsschnittstellen hinzugefügt. Im Gegensatz zu älteren Schnittstellen sind diese generisch. Das bedeutete, dass wir sie für jeden Referenztyp verwenden konnten.
BiPredicate<T, U> war eine solche Schnittstelle. Die einzige abstrakte Methode hat diese Definition:
boolean test(T t, U u);
Dies bedeutet, dassFilenameFilter nur ein Sonderfall vonBiPredicate ist, wobeiTFile undUString ist.
4. Fazit
Obwohl wir jetzt generischePredicate- undBiPredicate-Funktionsschnittstellen haben, werden weiterhinFilenameFilter auftreten, einfach weil sie in vorhandenen Java-Bibliotheken verwendet wurden.
Außerdem erfüllt es seinen einzigen Zweck gut, sodass es keinen Grund gibt, es gegebenenfalls nicht zu verwenden.
Wie immer sind alle Beispieleover on GitHub verfügbar.