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);
これが意味するのは、FilenameFilterはBiPredicateの特殊なケースであり、TはFileであり、UはStringです。
4. 結論
現在、汎用のPredicateおよびBiPredicate機能インターフェイスがありますが、既存のJavaライブラリで使用されているという理由だけでFilenameFilterの発生が引き続き見られます。
また、単一の目的を十分に果たすため、該当する場合は使用しない理由はありません。
いつものように、すべての例は利用可能なover on GitHubです。