Uso rapido di FilenameFilter

1. Introduzione

Java ha avuto interfacce funzionali prima dell'aggiunta dell'annotazione informativa, @FunctionalInterface . FilenameFilter è una di queste interfacce.

Daremo una breve occhiata al suo utilizzo e capiremo dove si inserisce nel mondo di Java oggi.

2. FilenameFilter

Poiché si tratta di un'interfaccia funzionale, dobbiamo avere esattamente un metodo astratto e FilenameFilter segue questa definizione:

boolean accept(File dir, String name);

3. Utilizzo

Usiamo FilenameFilter quasi esclusivamente per elencare tutti i file - che soddisfano il filtro specificato - all'interno di una directory.

I metodi list (..) e listFiles (..) in sovraccarico in java.io.File prendono un'istanza di FilenameFilter e restituiscono un array di tutti i file che soddisfano il filtro.

Il seguente test case filtra tutti i file json in una directory:

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

Oracle ha aggiunto più di 40 interfacce funzionali in Java 8 e, a differenza delle interfacce legacy, queste sono generiche. Ciò significava che potevamo usarli per qualsiasi tipo di riferimento.

BiPredicate era una di queste interfacce. Il suo unico metodo astratto ha questa definizione:

boolean test(T t, U u);

Ciò significa che FilenameFilter è solo un caso speciale di BiPredicate dove T è File e U è String .

4. Conclusione

Anche se ora disponiamo di interfacce funzionali generiche Predicate e BiPredicate , continueremo a vedere le occorrenze di FilenameFilter semplicemente perché è stato utilizzato nelle librerie Java esistenti.

Inoltre, serve bene al suo unico scopo, quindi non c'è motivo di non usarlo quando applicabile.

Come sempre, tutti gli esempi sono disponibili su GitHub.