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で利用可能]にあります。