Utilisation rapide de FilenameFilter
1. introduction
Java a eufunctional interfaces avant l'ajout de l'annotation informative,@FunctionalInterface. FilenameFilter est l'une de ces interfaces.
Nous allons examiner brièvement son utilisation et comprendre où elle se situe dans le monde de Java aujourd'hui.
2. FilenameFilter
Puisquethis is a functional interface – we have to have exactly one abstract method etFilenameFilter suit cette définition:
boolean accept(File dir, String name);
3. Usage
Nous utilisonsFilenameFilter presque exclusivement pour lister tous les fichiers - qui satisfont le filtre spécifié - dans un répertoire.
Les méthodes surchargéeslist(..) etlistFiles(..) dansjava.io.File prennent une instance deFilenameFilter et renvoient unarray de tous les fichiers qui satisfont le filtre.
Le scénario de test suivant filtre tous les fichiersjson dans un répertoire:
@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 commeBiPredicate
Oracle a ajouté plus de 40 interfaces fonctionnelles dans Java 8 et, contrairement aux interfaces existantes, celles-ci sont génériques. Cela signifiait que nous pouvions les utiliser pour n'importe quel type de référence.
BiPredicate<T, U> était l'une de ces interfaces. Sa méthode abstraite unique a cette définition:
boolean test(T t, U u);
Cela signifie queFilenameFilter est juste un cas particulier deBiPredicate oùT estFile etU estString.
4. Conclusion
Même si nous avons maintenant des interfaces fonctionnelles génériquesPredicate etBiPredicate, nous continuerons à voir des occurrences deFilenameFilter simplement parce qu'il a été utilisé dans les bibliothèques Java existantes.
En outre, il remplit bien son seul objectif, il n'y a donc aucune raison de ne pas l'utiliser le cas échéant.
Comme toujours, tous les exemples sont disponiblesover on GitHub.