Быстрое использование FilenameFilter
1. Вступление
В Java до добавления информативной аннотации@FunctionalInterface было указано значениеfunctional interfaces. FilenameFilter - один из таких интерфейсов.
Мы кратко рассмотрим его использование и поймем, какое место он занимает в современном мире Java.
2. FilenameFilterс
Посколькуthis is a functional interface – we have to have exactly one abstract method иFilenameFilter следует этому определению:
boolean accept(File dir, String name);
3. использование
Мы используемFilenameFilter почти исключительно для вывода списка всех файлов, удовлетворяющих указанному фильтру, внутри каталога.
Перегруженные методыlist(..) иlistFiles(..) вjava.io.File берут экземплярFilenameFilter и возвращаютarray всех файлов, удовлетворяющих фильтру.
Следующий тестовый пример фильтрует все файлы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 добавил более 40 функциональных интерфейсов в Java 8, и в отличие от устаревших интерфейсов, они являются общими. Это означало, что мы могли использовать их для любого ссылочного типа.
BiPredicate<T, U> был одним из таких интерфейсов. Его единственный абстрактный метод имеет следующее определение:
boolean test(T t, U u);
Это означает, чтоFilenameFilter - это просто частный случайBiPredicate, гдеT - этоFile, аU - этоString.
4. Заключение
Несмотря на то, что теперь у нас есть общие функциональные интерфейсыPredicate иBiPredicate, мы по-прежнему будем видеть вхожденияFilenameFilter просто потому, что он использовался в существующих библиотеках Java.
Кроме того, он хорошо служит своей единственной цели, поэтому нет причин не использовать его, когда это применимо.
Как всегда доступны все примерыover on GitHub.