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.