Рубрики
Без рубрики

Быстрое использование фильтра имен файлов

Узнайте о FilenameFilter, функциональном интерфейсе для фильтрации списка файлов по имени.

Автор оригинала: baeldung.

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 .