Бързо използване на FilenameFilter

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.