Перейти к основному содержимому

Быстрое использование FilenameFilter

· 2 мин. чтения

1. Введение

В Java были функциональные интерфейсы до добавления информативной аннотации @FunctionalInterface . FilenameFilter — один из таких интерфейсов.

Мы кратко рассмотрим его использование и поймем, какое место он занимает в современном мире Java.

2. Фильтр имени файла

Так как это функциональный интерфейс — у нас должен быть ровно один абстрактный метод , и FilenameFilter следует этому определению:

boolean accept(File dir, String name);

3. Использование

Мы используем FilenameFilter почти исключительно для вывода списка всех файлов, удовлетворяющих указанному фильтру, внутри каталога.

Перегруженные методы list(..) и listFiles(..) в java.io.File принимают экземпляр FilenameFilter и возвращают массив всех файлов, удовлетворяющих фильтру.

Следующий тестовый пример фильтрует все файлы json в каталоге:

@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 как BiPredicate

Oracle добавила в Java 8 более 40 функциональных интерфейсов, и, в отличие от устаревших интерфейсов, они являются универсальными. Это означало, что мы могли использовать их для любого ссылочного типа.

BiPredicate<T, U> был одним из таких интерфейсов. Его единственный абстрактный метод имеет следующее определение:

boolean test(T t, U u);

Это означает, что FilenameFilter — это всего лишь частный случай BiPredicate, где TFile , а UString .

4. Вывод

Несмотря на то, что теперь у нас есть универсальные функциональные интерфейсы Predicate и BiPredicate , мы по-прежнему будем встречать FilenameFilter просто потому, что он использовался в существующих библиотеках Java.

Кроме того, он хорошо служит своей единственной цели, поэтому нет причин не использовать его, когда это применимо.

Как всегда, все примеры доступны на GitHub .