1. 序章

Javaには、有益なアノテーション @FunctionalInterface が追加される前に、機能インターフェイスがありました。 FilenameFilterはそのようなインターフェースの1つです。

その使用法を簡単に見て、今日のJavaの世界のどこに適合するかを理解します。

2. ファイル名フィルター

これは機能的なインターフェイスであるため、抽象メソッドが1つだけ必要であり、FilenameFilterは次の定義に従います。

boolean accept(File dir, String name);

3. 使用法

FilenameFilter をほぼ排他的に使用して、ディレクトリ内のすべてのファイル(指定されたフィルターを満たす)を一覧表示します。

オーバーロードされたlist(..)および 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 as BiPredicate

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

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

boolean test(T t, U u);

つまり、 FilenameFilter は、 BiPredicate の特殊なケースであり、 TFileであり、U文字列

4. 結論

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

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

いつものように、すべての例はGitHubから入手できます。