FilenameFilterの簡単な使い方

FilenameFilterの簡単な使用

1. 前書き

Javaには、有益な注釈@FunctionalInterfaceが追加される前にfunctional interfacesがありました。 FilenameFilterはそのようなインターフェースの1つです。

その使用法を簡単に見て、今日の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をほぼ排他的に使用して、ディレクトリ内のすべてのファイル(指定されたフィルターを満たす)を一覧表示します。

java.io.Fileのオーバーロードされたlist(..)およびlistFiles(..)メソッドは、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 asBiPredicate

Oracleは、Java 8に40を超える機能インターフェースを追加しました。従来のインターフェースとは異なり、これらは汎用です。 つまり、どの参照型にも使用できるということです。

BiPredicate<T, U>はそのようなインターフェースの1つでした。 その単一の抽象メソッドには次の定義があります。

boolean test(T t, U u);

これが意味するのは、FilenameFilterBiPredicateの特殊なケースであり、TFileであり、UStringです。

4. 結論

現在、汎用のPredicateおよびBiPredicate機能インターフェイスがありますが、既存のJavaライブラリで使用されているという理由だけでFilenameFilterの発生が引き続き見られます。

また、単一の目的を十分に果たすため、該当する場合は使用しない理由はありません。

いつものように、すべての例は利用可能なover on GitHubです。