Ekspresi lambda pertama
Sebelum Lambda muncul, jika kita perlu menulis multithread, kita mungkin memerlukan metode berikut:
Runnable runnable = new runnable () {@Override public void run () {System.out.println ("Hello Runnable"); }}; ... thread.start ();Contoh di atas akan jauh lebih mudah jika Anda berubah menggunakan lambda:
Runnable noargs = ()-> system.out.println ("Hello lambda! ~"); ... thread.start ();Ekspresi lambda adalah fungsi anonim yang melewati perilaku seperti data. Ekspresi menggunakan -> untuk memisahkan parameter dari tubuh, -> untuk mendahului bagian parameter, dan kemudian ini adalah bagian tubuh.
Bentuk Lambda lainnya
BineryOperator <long> add = (x, y)-> x+y; // atau Bineryoperator <long> add = (long x, long y)-> x+y; // atau Bineryoperator <long> add = (long x, long y)-> {x+y; };Di atas adalah semua bentuk ekspresi lambda.
Maka pertanyaannya adalah:
Apa yang dimiliki BineryOperator <long> add = (long x, long y)-> x+y; berarti?
Baris kode ini tidak berbicara tentang menambahkan angka, tetapi membuat fungsi untuk menghitung hasil menambahkan dua angka. Jenis ADD adalah Bineryoperator <long>, yang bukan jumlah dari dua angka, tetapi kode yang menambahkan dua angka. Contoh berikut menunjukkan cara menggunakan variabel ini:
Bineryoperator <dong> add = (long x, long y)-> x+y; Long res = add.Apply (3L, 4L); System.out.println ("res ="+res); // output: res = 7 Antarmuka fungsi
Antarmuka fungsi adalah antarmuka dengan hanya satu metode abstrak, digunakan sebagai jenis ekspresi lambda.
Misalnya, Runnable adalah antarmuka fungsi.
Buat antarmuka fungsi baru:
addoperator antarmuka publik <t, d> {long add (t satu, d dua);}menggunakan:
Addoperator <long, long> addoperator = (x, y)-> x +y; System.err.println ("Fungsi Kustom Listener Res ="+addoperator.add (34l, 65L)); Tipe target
Jenis target mengacu pada jenis konteks di mana ekspresi lambda berada. Misalnya, tetapkan ekspresi lambda ke variabel lokal, atau berikan ke metode sebagai parameter. Jenis variabel lokal atau parameter metode adalah jenis target dari ekspresi lambda.
Terakhir
Jika kami merujuk variabel lokal dalam metode ini di kelas dalam anonim, ini mensyaratkan bahwa variabel lokal bersifat final.
Di Lambda kami tidak perlu mendeklarasikan variabel lokal eksternal yang direferensikan sebagai final, tetapi variabel hanya dapat ditetapkan sekali.
Dalam contoh berikut, jika kami menghapus komentar dan menetapkan nama lagi, itu tidak akan dikompilasi dan pesan kesalahan akan ditampilkan: variabel lokal yang dirujuk dari ekspresi Lambda harus final atau final secara efektif.
Variabel lokal yang dirujuk oleh ekspresi Lambda harus final atau final faktual.
String name = getUserName (); // name = "hai"; Button.addactionListener (event-> system.out.println ("name ="+name)); Ketik inferensi
Jenis inferensi ekspresi lambda adalah perpanjangan dari inferensi tipe target yang diperkenalkan di Java7.
Jenis inferensi di java7:
Daftar <String> Daftar = ArrayList baru <> ();
Dalam contoh di atas, kami tidak menentukan jenis arraylist paradigma, tetapi sebaliknya menyimpulkan jenis paradigma dari arraylist berdasarkan jenis daftar.
Misalnya: addoperator <long, long> addoperator = (x, y)-> x +y;
Melalui artikel ini, saya harap ini dapat membantu Anda belajar dan memahami bagian pengetahuan ini. Terima kasih atas dukungan Anda untuk situs web ini!