Uso rápido de FilenameFilter

1. Introducción

Java ha tenido interfaces funcionales antes de la adición de la anotación informativa, @FunctionalInterface . FilenameFilter es una de esas interfaces.

Echaremos un vistazo breve a su uso y entenderemos dónde encaja en el mundo de Java hoy.

2. FilenameFilter

Dado que esta es una interfaz funcional, debemos tener exactamente un método abstracto , y FilenameFilter sigue esta definición:

boolean accept(File dir, String name);

3. Uso

Usamos FilenameFilter casi exclusivamente para enumerar todos los archivos, que satisfacen el filtro especificado, dentro de un directorio.

Los métodos list (..) y listFiles (..) sobrecargados en java.io.File toman una instancia de FilenameFilter y devuelven una matriz de todos los archivos que satisfacen el filtro.

El siguiente caso de prueba filtra todos los archivos json en un directorio:

@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 como BiPredicate

Oracle agregó más de 40 interfaces funcionales en Java 8 y, a diferencia de las interfaces heredadas, estas son genéricas. Eso significaba que podíamos usarlos para cualquier tipo de referencia.

BiPredicate fue una de esas interfaces. Su método abstracto único tiene esta definición:

boolean test(T t, U u);

Lo que esto significa es que FilenameFilter es solo un caso especial de BiPredicate donde T es File y U es String .

4. Conclusión

Aunque ahora tenemos interfaces funcionales genéricas Predicate y BiPredicate , seguiremos viendo apariciones de FilenameFilter simplemente porque ha estado en uso en bibliotecas Java existentes.

Además, cumple bien su único propósito, por lo que no hay razón para no usarlo cuando corresponda.

Como siempre, todos los ejemplos están disponibles en GitHub.