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