1. введение
Java имела функциональные интерфейсы до добавления информативной аннотации, @functional Interface . FilenameFilter является одним из таких интерфейсов.
Мы кратко рассмотрим его использование и поймем, как он вписывается в современный мир Java.
2. Фильтр имен файлов
Поскольку это функциональный интерфейс – у нас должен быть ровно один абстрактный метод , и FilenameFilter следует этому определению:
boolean accept(File dir, String name);
3. Использование
Мы используем FilenameFilter почти исключительно для перечисления всех файлов, удовлетворяющих указанному фильтру, в каталоге.
Перегруженный список(..) и listFiles(..) методы в java.io.Файл возьмите экземпляр 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 как двупредикатный
Oracle добавила более 40 функциональных интерфейсов в Java 8, и, в отличие от устаревших интерфейсов, они являются универсальными. Это означало, что мы могли использовать их для любого ссылочного типа.
BiPredicate U> был одним из таких интерфейсов. Его ” единственный абстрактный метод имеет такое определение: U>
boolean test(T t, U u);
Это означает, что Фильтр имен файлов это просто частный случай Двупредикатный где T является Файл и U является Строка .
4. Заключение
Несмотря на то, что теперь у нас есть общие Предикат и Предикат функциональные интерфейсы, мы будем продолжать видеть вхождения FilenameFilter просто потому, что он использовался в существующих библиотеках Java.
Кроме того, он хорошо служит своей единственной цели, поэтому нет причин не использовать его, когда это применимо.
Как всегда, все примеры доступны на GitHub .