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,
где T
— File
, а U
— String
.
4. Вывод
Несмотря на то, что теперь у нас есть универсальные функциональные интерфейсы Predicate
и BiPredicate
, мы по-прежнему будем встречать FilenameFilter
просто потому, что он использовался в существующих библиотеках Java.
Кроме того, он хорошо служит своей единственной цели, поэтому нет причин не использовать его, когда это применимо.
Как всегда, все примеры доступны на GitHub .