Uso rápido do FilenameFilter

Uso rápido do FilenameFilter

1. Introdução

Java tevefunctional interfaces antes da adição da anotação informativa,@FunctionalInterface. FilenameFilter é uma dessas interfaces.

Vamos dar uma breve olhada em seu uso e entender onde ele se encaixa no mundo Java hoje.

2. FilenameFilter

Comothis is a functional interface – we have to have exactly one abstract method eFilenameFilter segue esta definição:

boolean accept(File dir, String name);

3. Uso

UsamosFilenameFilter quase exclusivamente para listar todos os arquivos - que satisfaçam o filtro especificado - dentro de um diretório.

Os métodoslist(..)elistFiles(..) sobrecarregados emjava.io.File tomam uma instância deFilenameFiltere retornamarray de todos os arquivos que satisfazem o filtro.

O caso de teste a seguir filtra todos os arquivosjson em um diretório:

@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 comoBiPredicate

A Oracle adicionou mais de 40 interfaces funcionais no Java 8 e, diferentemente das interfaces herdadas, elas são genéricas. Isso significava que poderíamos usá-los para qualquer tipo de referência.

BiPredicate<T, U> era uma dessas interfaces. Seu 'método abstrato único tem esta definição:

boolean test(T t, U u);

O que isso significa é queFilenameFilter é apenas um caso especial deBiPredicate, ondeT éFileeU éString.

4. Conclusão

Mesmo que agora tenhamos interfaces funcionaisPredicateeBiPredicate genéricas, continuaremos a ver ocorrências deFilenameFilter simplesmente porque ele está em uso em bibliotecas Java existentes.

Além disso, ele atende bem a seu propósito único, então não há razão para não usá-lo quando aplicável.

Como sempre, todos os exemplos estão disponíveisover on GitHub.