1. Pengenalan
Java telah mempunyai antara muka yang berfungsi sebelum penambahan anotasi maklumat, @FunctionalInterface . FilenameFilter adalah antara muka seperti itu.
Kami akan melihat penggunaannya secara ringkas dan memahami di mana ia sesuai di dunia Jawa hari ini.
2. FilenameFilter
Oleh kerana ini adalah antara muka yang berfungsi - kita mesti mempunyai satu kaedah abstrak , dan FilenameFilter mengikuti definisi ini:
boolean accept(File dir, String name);
3. Penggunaan
Kami menggunakan FilenameFilter hampir secara eksklusif untuk menyenaraikan semua fail - yang memenuhi penapis yang ditentukan - di dalam direktori.
Kaedah senarai (..) dan listFiles (..) yang terlalu banyak di java.io.File mengambil contoh FilenameFilter dan mengembalikan array semua fail yang memenuhi penapis.
Kes ujian berikut menyaring semua fail 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 daripada 40 antara muka fungsional di Java 8, dan tidak seperti antara muka lama, ini adalah generik. Itu bermaksud bahawa kita dapat menggunakannya untuk jenis rujukan apa pun.
BiPredicate adalah antara muka seperti itu. Kaedah abstrak tunggal mempunyai definisi ini:
boolean test(T t, U u);
Ini bermaksud bahawa FilenameFilter hanyalah kes khas BiPredicate di mana T adalah File dan U adalah String .
4. Kesimpulan
Walaupun sekarang kami mempunyai antara muka fungsi Predicate dan BiPredicate generik , kami akan terus melihat kejadian FilenameFilter hanya kerana telah digunakan di perpustakaan Java yang ada.
Ia juga berfungsi untuk tujuan utamanya, jadi tidak ada alasan untuk tidak menggunakannya jika berlaku.
Seperti biasa, semua contoh boleh didapati di GitHub.