Schnelle Verwendung von FilenameFilter

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.