Penggunaan Cepat FilenameFilter

1. Perkenalan

Java memiliki antarmuka fungsional sebelum penambahan anotasi informatif, @FunctionalInterface . FilenameFilter adalah salah satu antarmuka tersebut.

Kita akan melihat sekilas penggunaannya dan memahami di mana tempatnya di dunia Java saat ini.

2. Filter Nama File

Karena ini adalah antarmuka fungsional - kita harus memiliki tepat satu metode abstrak , dan FilenameFilter mengikuti definisi ini:

boolean accept(File dir, String name);

3. Penggunaan

Kami menggunakan FilenameFilter hampir secara eksklusif untuk mendaftar semua file - yang memenuhi filter yang ditentukan - di dalam direktori.

Metode list (..) dan listFiles (..) yang kelebihan beban di java.io.File mengambil turunan dari FilenameFilter dan mengembalikan larik semua file yang memenuhi filter.

Kasus uji berikut memfilter semua file json dalam direktori:

@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 sebagai BiPredicate

Oracle menambahkan lebih dari 40 antarmuka fungsional di Java 8, dan tidak seperti antarmuka lawas, ini bersifat generik. Itu berarti kami dapat menggunakannya untuk jenis referensi apa pun.

BiPredicate adalah salah satu antarmuka tersebut. Metode abstrak tunggalnya memiliki definisi ini:

boolean test(T t, U u);

Artinya adalah FilenameFilter hanyalah kasus khusus BiPredicate di mana T adalah File dan U adalah String .

4. Kesimpulan

Meskipun kami sekarang memiliki antarmuka fungsional Predicate dan BiPredicate generik , kami akan terus melihat kemunculan FilenameFilter hanya karena telah digunakan di perpustakaan Java yang ada.

Selain itu, ini melayani tujuan tunggal dengan baik, jadi tidak ada alasan untuk tidak menggunakannya jika memungkinkan.

Seperti biasa, semua contoh tersedia di GitHub.