Java 8 disebut versi yang paling banyak diubah dalam sejarah Java. Ini berisi banyak fitur baru yang penting, yang paling inti adalah penambahan ekspresi Lambda dan Streamapi. Keduanya juga bisa digunakan bersama. Pertama, mari kita lihat apa itu ekspresi lambda.
Menggunakan ekspresi lambda tidak hanya membuat kode sederhana, tetapi juga dapat dibaca, dan yang paling penting, jumlah kode juga berkurang banyak. Namun, sampai batas tertentu, fungsi -fungsi ini telah banyak digunakan dalam bahasa JVM seperti Scala.
Tidak mengherankan, komunitas Scala luar biasa, karena banyak konten Java 8 sepertinya dipindahkan dari Scala. Hingga taraf tertentu, sintaksis Java 8 lebih rinci tetapi tidak terlalu jelas dari Scala, tetapi itu tidak banyak bicara, dan jika bisa, itu mungkin membangun ekspresi lambda seperti yang dilakukan Scala.
Di satu sisi, jika Java terus mengembangkan dan mengimplementasikan fungsi yang telah diterapkan Scala di sekitar Lambda, maka Scala mungkin tidak diperlukan. Di sisi lain, jika hanya menyediakan beberapa fitur inti, seperti membantu kelas internal anonim, Scala dan bahasa lain akan terus berkembang dan dapat menyalip Java. Bahkan, ini adalah hasil terbaik. Hanya dengan persaingan yang bisa ada kemajuan. Bahasa lain terus berkembang dan tumbuh, dan tidak perlu khawatir apakah mereka akan ketinggalan zaman.
Ekspresi Lambda, penjelasan tentang Wikipedia adalah operator yang digunakan untuk mewakili fungsi dan penutupan anonim. Saya merasa bahwa penjelasan ini masih sangat abstrak. Mari kita lihat sebuah contoh.
kelas publik swingtest {public static void main (string [] args) {jframe jframe = new jframe ("my jframe"); Jbutton jbutton = jbutton baru ("my jbutton"); jbutton.addactionListener (ActionListener baru () {@Override public void actionPerformed (actionEvent e) {System.out.println ("Tombol ditekan!");}}); jframe.add (jbutton); jframe.pack (); jframe.setVisible (true); jframe.setDefaultCloseOperation (jframe.exit_on_close); }}Ini adalah sepotong kode dalam pemrograman ayunan yang mengikat acara mendengarkan dengan tombol. Saat tombol diklik, konten "Buttonpressed!" akan output pada konsol. Di sini kami membuat contoh kelas dalam anonim untuk mengikat pendengar, yang juga merupakan bentuk organisasi kode yang relatif umum di masa lalu. Tetapi jika kita melihat lebih dekat, kita akan menemukan bahwa pada kenyataannya, apa yang benar -benar fokus adalah parameter tipe ActionEvent dan pernyataan System.out.println ("ButtonPressed!"); output ke konsol.
Jika kode dalam program sebelumnya yang membuat kelas internal anonim diganti dengan ekspresi lambda, kode tersebut adalah sebagai berikut
kelas publik swingtest {public static void main (string [] args) {jframe jframe = new jframe ("my jframe"); Jbutton jbutton = jbutton baru ("my jbutton"); jbutton.addactionListener (e -> system.out.println ("Tombol ditekan!")); jframe.add (jbutton); jframe.pack (); jframe.setVisible (true); jframe.setDefaultCloseOperation (jframe.exit_on_close);}} Perhatikan perubahan di bagian tengah kode, dari 6 baris kode asli, sekarang 1 baris dapat diimplementasikan. Ini adalah bentuk sederhana dari ekspresi lambda.
Dapat dilihat bahwa sintaks ekspresi lambda adalah
(param1, param2, param3) -> {// tODO}Program tipe parameter di sini dapat disimpulkan berdasarkan konteks, tetapi tidak semua jenis dapat disimpulkan. Saat ini, kita perlu menampilkan tipe parameter yang dinyatakan. Ketika hanya ada satu parameter, tanda kurung dapat dihilangkan. Ketika bagian TODO hanya memiliki satu baris kode, kawat gigi di luar dapat dihilangkan. Seperti dalam contoh kami di atas
Jadi selain kode ringkas, apakah ekspresi Lambda membawa kita perubahan?
Mari kita ingat bahwa di Java, kita tidak dapat melewati fungsi sebagai parameter ke suatu metode, kita juga tidak dapat menyatakan bahwa nilai pengembalian adalah metode fungsi. Sebelum Java 8, jawabannya adalah ya.
Jadi, dalam contoh di atas, kita benar -benar dapat melewati sepotong logika kode sebagai parameter untuk pendengar, memberi tahu pendengar bahwa Anda dapat melakukan ini ketika acara dipicu, tanpa perlu menggunakan kelas internal anonim sebagai parameter. Ini juga merupakan fitur baru lain yang dibawa oleh Java 8: pemrograman fungsional.
Ada banyak bahasa yang mendukung pemrograman fungsional. Dalam JavaScript, sangat umum untuk melewati fungsi sebagai parameter atau mengembalikan nilai sebagai fungsi. JavaScript adalah bahasa fungsional yang sangat umum.
Lambda menambahkan fitur pemrograman fungsional yang hilang ke Java, memungkinkan kami untuk memperlakukan fungsi sebagai warga negara kelas satu.
Dalam bahasa pemrograman fungsional, jenis ekspresi lambda adalah fungsi. Di Java, ekspresi lambda adalah objek, dan mereka harus dilampirkan pada tipe objek khusus - antarmuka fungsional.
Selanjutnya, mari kita lihat definisi antarmuka fungsional:
Jika ada dan hanya satu metode abstrak dalam antarmuka (metode di kelas objek tidak termasuk), maka antarmuka ini dapat dianggap sebagai antarmuka fungsional.
@FunctionInterfacepublic Interface runnable {/** * Ketika suatu objek mengimplementasikan antarmuka <code> runnable </code> digunakan * untuk membuat utas, memulai utas menyebabkan metode * <code> run </code> objek yang dipanggil di utas yang dieksekusi secara terpisah *. * <p> * Kontrak umum dari metode <code> Jalankan </code> adalah bahwa ia dapat * mengambil tindakan apa pun. * * @see java.lang.thread#run () */ public abstrak void run ();}Mari kita lihat pernyataan antarmuka yang dapat dijalankan. Setelah Java 8, antarmuka runnable memiliki anotasi fungsional interface tambahan, menunjukkan bahwa antarmuka adalah antarmuka fungsional. Namun, jika kita tidak menambahkan anotasi functionalInterface, jika ada dan hanya satu metode abstrak dalam antarmuka, kompiler juga akan menganggap antarmuka sebagai antarmuka fungsional.
@FunctionInterfacepublic Interface myInterface {void test (); String toString ();}MyInterface juga merupakan antarmuka fungsional, karena tostring () adalah metode di kelas objek, tetapi ditulis ulang di sini dan tidak akan meningkatkan jumlah metode abstrak dalam antarmuka.
(Untuk menyebutkan di sini, di Java 8, metode dalam antarmuka tidak hanya dapat memiliki metode abstrak, tetapi juga memiliki metode yang diimplementasikan spesifik. Mereka disebut metode default, yang akan diperkenalkan secara rinci nanti)
Karena di Java, ekspresi Lambda adalah objek. Jadi apa jenis objek ini? Mari kita tinjau program swingtest, di mana instance antarmuka ActionListener dibuat di kelas internal anonim.
jbutton.addactionListener (ActionListener baru () {@Override public void actionPerformed (actionEvent e) {System.out.println ("Tombol ditekan!");}});Ditingkatkan dengan ekspresi lambda
jbutton.addactionListener (e -> system.out.println ("Tombol ditekan!"));Artinya, kami menggunakan ekspresi lambda untuk membuat instance dari antarmuka ActionListener, dan kemudian melihat definisi antarmuka ActionListener.
ActionListener antarmuka publik memperluas EventListener { /*** dipanggil saat suatu tindakan terjadi. */ public void actionPerformed (ActionEvent e);} Hanya ada satu metode abstrak. Meskipun anotasi fungsionalInterface tidak ditambahkan, itu juga sesuai dengan definisi antarmuka fungsional. Kompiler akan menganggap ini sebagai antarmuka fungsional.
Oleh karena itu, menggunakan ekspresi Lambda dapat membuat contoh antarmuka fungsional. Artinya, ekspresi lambda mengembalikan tipe antarmuka fungsional.
Bahkan, ada tiga cara untuk membuat instance antarmuka fungsional (lihat anotasi functionalInterface):
1. Ekspresi Lambda
2. Kutipan metode
3. Referensi Metode Konstruktor
Meringkaskan
Di atas adalah semua tentang artikel ini tentang pemahaman sederhana Java 8 tentang ekspresi lambda dan antarmuka fungsional. Saya harap ini akan membantu semua orang. Teman yang tertarik dapat terus merujuk ke topik terkait lainnya di situs ini. Jika ada kekurangan, silakan tinggalkan pesan untuk menunjukkannya!