FilenameFilterの簡単な使い方

1前書き

Javaには、有益な注釈 @ @ FunctionalInterface が追加される前に、/java-8-functional-interfaces[機能インターフェース]というリンクがありました。 FilenameFilter はそのようなインタフェースの1つです。

その使い方を簡単に見て、今日のJavaの世界のどこに当てはまるかを理解します。

2 FilenameFilter

  • これは機能的なインターフェースなので - 抽象メソッドを1つだけ** 持つ必要があり、 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 BiPredicate として

オラクル社は、Java 8に40を超える機能インタフェースを追加しました。従来のインタフェースとは異なり、これらは汎用的です。それは私達があらゆる参照型にそれらを使用できることを意味しました。

BiPredicate<T、U> はそのようなインタフェースの1つです。その単一の抽象メソッドはこの定義を持ちます。

boolean test(T t, U u);
  • これが意味するのは、 FilenameFilter BiPredicate の特別な場合にすぎないということです。ここで、 T File で、 U String です。

4結論

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

また、それはその唯一の目的を果たすので、適用できるときにそれを使わない理由はありません。

いつものように、すべての例はhttps://github.com/eugenp/tutorials/tree/master/core-java-io[GitHubで利用可能]にあります。