Berbicara tentang Java 8, hal pertama yang terlintas dalam pikiran adalah lambda (penutupan) dan metode ekstensi virtual (metode default). Fitur ini telah lama digemari oleh situs-situs teknologi besar, dan ini juga merupakan fitur pertama yang akan kita bicarakan di awal seri Java 8 kami (JEP126 http://openjdk.java.net/jeps/126), beberapa perpustakaan jdk8 telah didesain ulang menggunakan ekspresi lambda. Memahaminya sangat penting untuk mempelajari fitur-fitur baru Java 8.
1. Antarmuka fungsional
Antarmuka fungsional (antarmuka fungsional disebut juga antarmuka fungsional, tetapi sebenarnya sama saja). Sederhananya, antarmuka fungsional adalah antarmuka yang hanya berisi satu metode. Misalnya, java.lang.Runnable dan java.util.Comparator di perpustakaan standar Java adalah antarmuka fungsional yang khas. Java 8 menyediakan @FunctionalInterface sebagai anotasi. Anotasi ini tidak diperlukan selama antarmuka memenuhi standar antarmuka fungsional (yaitu, antarmuka yang hanya berisi satu metode), namun mesin virtual akan menentukannya yang terbaik adalah menggunakan anotasi @FunctionalInterface pada antarmuka untuk mendeklarasikannya. Hal ini mencegah orang lain di tim secara keliru menambahkan metode baru ke antarmuka.
Lambda di Java tidak dapat muncul sendiri, memerlukan antarmuka fungsional untuk menampungnya. Badan metode ekspresi lambda sebenarnya merupakan implementasi dari antarmuka fungsional.
2. Sintaks Lambda
Berisi tiga bagian
1. Parameter formal dipisahkan dengan koma dalam tanda kurung. Parameter adalah parameter metode dalam antarmuka fungsional.
2. Simbol panah: ->
3. Badan metode bisa berupa ekspresi atau blok kode. Badan metode adalah implementasi metode dalam antarmuka fungsional. Jika berupa blok kode, maka harus dibungkus dengan {} dan nilai kembalian diperlukan, tetapi ada pengecualian. Jika nilai yang dikembalikan metode dalam antarmuka fungsional tidak berlaku, {} tidak diperlukan.
Secara keseluruhan tampilannya seperti ini:
Copy kode kodenya sebagai berikut:
(parameter) -> ekspresi atau (parameter) -> { pernyataan;
Lihat contoh lengkapnya agar mudah dipahami
Copy kode kodenya sebagai berikut:
/**
* Uji ekspresi lambda
*
* @penulis benhail
*/
kelas publik TestLambda {
public static void runThreadUseLambda() {
//Runnable adalah antarmuka fungsi yang hanya berisi metode run tanpa parameter yang mengembalikan void;
//Jadi tidak ada parameter di sisi kiri ekspresi lambda dan tidak ada return di sisi kanan.
new Thread(() ->System.out.println("thread diimplementasikan oleh lambda")).start();
}
public static void runThreadUseInnerClass() {
//Saya tidak akan berbicara banyak tentang metode ini. Ini adalah pendekatan umum di versi lama.
Utas baru(yang baru Dapat Dijalankan() {
@Mengesampingkan
menjalankan kekosongan publik() {
System.out.println("Thread diimplementasikan oleh kelas internal");
}
}).awal();
}
public static void main(String[] args) {
TestLambda.runThreadUseLambda();
TestLambda.runThreadUseInnerClass();
}
}
Terlihat bahwa kode yang dirancang menggunakan ekspresi lambda akan lebih ringkas dan mudah dibaca.
3. Referensi metode
Faktanya, ini adalah cara penulisan ekspresi lambda yang disederhanakan. Metode yang direferensikan sebenarnya adalah implementasi isi metode dari ekspresi lambda. Sintaksnya juga sangat sederhana. bagian tengahnya adalah "::", dan sisi kanannya adalah nama metode yang sesuai. Seperti yang ditunjukkan di bawah ini:
Salin kode sebagai berikut: ObjectReference::methodName
Format kutipan metode umum adalah
Jika ini adalah metode statis, itu adalah ClassName::methodName. Seperti Objek::sama dengan
Jika ini adalah metode instan, maka itu adalah Instance::methodName. Seperti Objek obj=objek baru();obj::sama dengan;
Konstruktor. Ini adalah ClassName::new
Mari kita lihat contoh lengkapnya agar lebih mudah dipahami:
Copy kode kodenya sebagai berikut:
impor java.awt.FlowLayout;
impor java.awt.event.ActionEvent;
impor javax.swing.JButton;
impor javax.swing.JFrame;
/**
*
* @penulis benhail
*/
kelas publik TestMethodReference {
public static void main(String[] args) {
bingkai JFrame = JFrame baru();
frame.setLayout(FlowLayout baru());
frame.setVisible(benar);
JButton button1 = new JButton("Klik saya!");
JButton button2 = new JButton("Klik saya juga!");
frame.getContentPane().add(button1);
frame.getContentPane().add(button2);
//Parameter metode addActionListener di sini adalah ActionListener, yang merupakan antarmuka fungsional
//Gunakan metode ekspresi lambda
button1.addActionListener(e -> { System.out.println("Inilah implementasi Lambda"); });
//Gunakan metode referensi metode
button2.addActionListener(TestMethodReference::doSomething);
}
/**
* Berikut adalah metode implementasi antarmuka fungsional ActionListener
* @param e
*/
public static void doSomething(ActionEvent e) {
System.out.println("Berikut adalah referensi metode penerapannya");
}
}
Terlihat bahwa metode doSomething merupakan implementasi dari ekspresi lambda. Keuntungannya adalah jika Anda merasa metode lambda sangat panjang dan mempengaruhi keterbacaan kode, referensi metode adalah solusinya.
4. Ringkasan
Di atas adalah keseluruhan isi sintaks ekspresi lambda. Saya yakin setiap orang memiliki pemahaman tertentu tentang ekspresi lambda. Namun, jika kodenya sederhana, tidak akan membuat banyak pemirsa terkesan perlu memperkenalkan lambda di java 8 karena lambda Ekspresi dapat menyederhanakan pemrosesan data multi-utas atau multi-inti pada suatu kumpulan dan memberikan kecepatan pemrosesan kumpulan yang lebih cepat. Hal ini akan dibahas nanti. Fitur JEP126 ini akan dibagi menjadi tiga bagian Ada terlalu banyak hal untuk ditulis. Bagian ini membuat pembaca terbiasa dengan sintaksis dan konsep ekspresi lambda dan referensi metode. Bagian kedua adalah tentang konten metode ekstensi virtual (metode default). pengumpulan dan solusi data dalam jumlah besar. Temukan kekuatan ekspresi lambda. Pantau terus. . . .