Penggunaan Pantas FilenameFilter

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.