1. Въведение
Java е имала функционални интерфейси преди добавянето на информативната анотация @FunctionalInterface . FilenameFilter е един такъв интерфейс.
Ще разгледаме накратко неговото използване и ще разберем къде се вписва в света на Java днес.
2. FilenameFilter
Тъй като това е функционален интерфейс - трябва да имаме точно един абстрактен метод и FilenameFilter следва тази дефиниция:
boolean accept(File dir, String name);
3. Употреба
Използваме FilenameFilter почти изключително, за да изброим всички файлове - които отговарят на посочения филтър - в директория.
Методите за претоварен списък (..) и 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 добави повече от 40 функционални интерфейса в Java 8 и за разлика от старите интерфейси, те са общи. Това означаваше, че можем да ги използваме за всеки референтен тип.
BiPredicate беше един такъв интерфейс. Неговият „единичен абстрактен метод има следното определение:
boolean test(T t, U u);
Това означава, че FilenameFilter е само специален случай на BiPredicate, където T е файл, а U е низ .
4. Заключение
Въпреки че вече имаме общи функционални интерфейси Predicate и BiPredicate , ние ще продължим да виждаме появите на FilenameFilter просто защото той се използва в съществуващите библиотеки на Java.
Освен това той служи добре на своята единствена цел, така че няма причина да не го използвате, когато е приложимо.
Както винаги, всички примери са достъпни в GitHub.