Utilisation rapide de FilenameFilter

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 deBiPredicateT 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.