Di bawah ini kami terus menyelami model pemrograman fungsional Java8
test kelas publik {public static void main (string [] args) {list <integer> list = arrays.aslist (1,2,3,4,5,6,7,8,9,10); list.foreach (konsumen baru <Integer> () {@Override public void accept (integer integer) {system.out.println (integer);}}); }}Program ini sederhana, pertama -tama inisialisasi kumpulan tipe integer dan kemudian output setiap elemen ke konsol. Di antara mereka, kami memperhatikan metode foreach, yang merupakan metode default yang baru ditambahkan di Java 8.
antarmuka publik iterable <t> {. . menghilangkan. default void foreach (konsumen <? super t> tindakan) {objeks.requirenonnull (action); untuk (t t: this) {action.accept (t); }}}Ini dinyatakan dalam antarmuka iterable dan dimodifikasi oleh kata kunci default. Dengan cara ini, setiap subtipe antarmuka ini dapat mewarisi implementasi metode foreach, sehingga antarmuka daftar adalah subinterface tidak langsung dari iterable, sehingga juga mewarisi metode default. Java8 mengadopsi cara pintar ini untuk memperluas fungsi antarmuka dan kompatibel dengan versi lama.
Selanjutnya, kami menganalisis implementasi foreach. Pertama, kami menerima tindakan parameter dari jenis konsumen, melakukan penilaian yang tidak kosong, dan kemudian melintasi semua elemen saat ini dan menyerahkannya ke metode penerimaan tindakan untuk diproses. Jadi apa itu konsumen? Lihat kode sumber
@FunctionInterfacepublic Interface Consumer <T> { /*** Melakukan operasi ini pada argumen yang diberikan. * * @param t argumen input */ void menerima (t t); . .Omitted.} Antarmuka, dengan hanya satu metode abstrak, dimodifikasi oleh @FunctionalInterface, antarmuka fungsional yang khas.
Oke, sekarang kita tahu bahwa parameter jenis konsumen yang diterima oleh foreach adalah antarmuka fungsional. Satu -satunya metode abstrak menerima antarmuka menerima parameter dan tidak mengembalikan nilai. Dari artikel sebelumnya, kita tahu bahwa salah satu cara untuk membuat contoh tipe antarmuka fungsional adalah dengan menggunakan ekspresi lambda, sehingga Anda dapat mengubah program teratas.
test kelas publik {public static void main (string [] args) {list <integer> list = arrays.aslist (1,2,3,4,5,6,7,8,9,10); // Ekspresi Lambda menerima parameter tanpa mengembalikan daftar nilai.foreach (item -> System.out.println (item)); }} Item Ekspresi Lambda -> System.out.println (item) menerima parameter tanpa mengembalikan nilai, dan memenuhi persyaratan tanda tangan metode penerimaan dan disusun dan dilewati.
Dengan kata lain, jika ekspresi lambda digunakan untuk membuat instance antarmuka fungsional, parameter entri dan pengembalian ekspresi lambda ini harus sesuai dengan tanda tangan metode dari satu -satunya metode abstrak dalam antarmuka fungsional ini.
Selanjutnya, program akan dimodifikasi
test kelas publik {public static void main (string [] args) {list <integer> list = arrays.aslist (1,2,3,4,5,6,7,8,9,10); // Metode Referensi Daftar.foreach (System.out :: println); }} Saya melihat dua titik di belakang, tetapi saya tetap berantakan. . . Ini adalah cara kedua untuk membuat instance antarmuka fungsional: Metode referensi referensi sintaks adalah objek :: nama metode
Demikian pula, menggunakan metode referensi metode untuk membuat instance antarmuka fungsional juga harus mematuhi definisi tanda tangan metode. Lihat kode sumber Metode Println di sini
public void println (objek x) {string s = string.valueof (x); disinkronkan (ini) {print (s); newline (); }} Menerima parameter dan tidak mengembalikan nilai, dan mengkompilasinya.
Akhirnya, mari kita lihat jenis terakhir dari membuat antarmuka fungsional. Metode ketiga: membangun referensi metode dan terus memodifikasi program.
test kelas publik {public static void main (string [] args) {list <integer> list = arrays.aslist (1,2,3,4,5,6,7,8,9,10); // Daftar referensi metode konstruktor.foreach (test1 :: baru); } Test1 (integer i) {System.out.println (i); }} Sintaks yang dirujuk oleh konstruktor adalah: nama kelas :: baru
Kami telah menambahkan konstruktor baru ke Test1, yang menerima parameter, tidak mengembalikan nilai, dan mengkompilasi melalui. (Hanya untuk menunjukkan penggunaan kutipan konstruktor)
Berdasarkan artikel sebelumnya, kita dapat meringkas tiga cara untuk membuat tipe antarmuka fungsional:
1. Ekspresi Lambda
2. Kutipan metode
3. Referensi Metode Konstruktor
Catatan: Tidak peduli metode mana, tanda tangan metode harus sejalan dengan metode abstrak.