Быстрое использование FilenameFilter

Быстрое использование 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.