เมื่อพูดถึง Java 8 สิ่งแรกที่ต้องคำนึงถึงคือ lambda (การปิด) และวิธีการขยายเสมือน (วิธีเริ่มต้น) ฟีเจอร์นี้ได้รับความนิยมจากเว็บไซต์เทคโนโลยีรายใหญ่ ๆ มานานแล้ว และยังเป็นฟีเจอร์แรกที่เราจะพูดถึงด้วย จุดเริ่มต้นของซีรีส์ Java 8 ของเรา (JEP126 http://openjdk.java.net/jeps/126) ไลบรารี่ของ jdk8 บางส่วนได้รับการออกแบบใหม่โดยใช้ lambda expressions การทำความเข้าใจว่ามีความสำคัญอย่างยิ่งในการเรียนรู้คุณสมบัติใหม่ของ java 8
1. อินเทอร์เฟซการทำงาน
อินเทอร์เฟซการทำงาน (อินเทอร์เฟซการทำงานเรียกอีกอย่างว่าอินเทอร์เฟซการทำงาน แต่จริงๆ แล้วเป็นสิ่งเดียวกัน) พูดง่ายๆ ก็คือ ส่วนต่อประสานการทำงานคือส่วนต่อประสานที่มีวิธีเดียวเท่านั้น ตัวอย่างเช่น java.lang.Runnable และ java.util.Comparator ในไลบรารีมาตรฐาน Java เป็นอินเทอร์เฟซการทำงานทั่วไป Java 8 ให้ @FunctionalInterface เป็นคำอธิบายประกอบ ไม่จำเป็น ตราบใดที่อินเทอร์เฟซตรงตามมาตรฐานของอินเทอร์เฟซการทำงาน (นั่นคือ อินเทอร์เฟซที่มีเพียงวิธีเดียว) เครื่องเสมือนจะกำหนดโดยอัตโนมัติ วิธีที่ดีที่สุดคือใช้คำอธิบายประกอบ @FunctionalInterface บนอินเทอร์เฟซเพื่อประกาศ ซึ่งจะป้องกันไม่ให้บุคคลอื่นในทีมเพิ่มวิธีการใหม่ลงในอินเทอร์เฟซโดยไม่ได้ตั้งใจ
แลมบ์ดาใน Java ไม่สามารถปรากฏเพียงลำพังได้ จริงๆ แล้วต้องใช้อินเทอร์เฟซที่ใช้งานได้เพื่อเก็บไว้
2. ไวยากรณ์แลมบ์ดา
ประกอบด้วยสามส่วน
1. พารามิเตอร์อย่างเป็นทางการคั่นด้วยเครื่องหมายจุลภาคในวงเล็บ พารามิเตอร์คือพารามิเตอร์ของวิธีการในส่วนต่อประสานการทำงาน
2. สัญลักษณ์ลูกศร: ->
3. เนื้อความของวิธีการสามารถเป็นนิพจน์หรือบล็อกโค้ดได้ ส่วนเนื้อความของวิธีการคือการนำวิธีการไปใช้ในส่วนต่อประสานการทำงาน หากเป็นบล็อกโค้ดจะต้องห่อด้วย {} และจำเป็นต้องมีค่าส่งคืน มีข้อยกเว้น หากเมธอดคืนค่าในอินเทอร์เฟซการทำงานเป็นโมฆะ ก็ไม่จำเป็นต้องใช้ {}
โดยรวมแล้วดูเหมือนว่านี้:
คัดลอกรหัสรหัสดังต่อไปนี้:
(พารามิเตอร์) -> การแสดงออกหรือ (พารามิเตอร์) -> { คำสั่ง; }
ดูตัวอย่างที่สมบูรณ์เพื่อความเข้าใจง่าย
คัดลอกรหัสรหัสดังต่อไปนี้:
-
* ทดสอบการแสดงออกของแลมบ์ดา
-
* @ผู้เขียน benhail
-
TestLambda ระดับสาธารณะ {
โมฆะสาธารณะคงที่ runThreadUseLambda () {
//Runnable เป็นอินเทอร์เฟซฟังก์ชันที่มีเฉพาะวิธีการเรียกใช้แบบไม่มีพารามิเตอร์ที่คืนค่าเป็นโมฆะ
//ดังนั้นจึงไม่มีพารามิเตอร์ทางด้านซ้ายของนิพจน์แลมบ์ดาและไม่มีการส่งคืนทางด้านขวา เพียงพิมพ์ประโยค
new Thread(() ->System.out.println("thread นำมาใช้โดย lambda")).start();
-
โมฆะสาธารณะคง runThreadUseInnerClass () {
//ฉันจะไม่พูดถึงวิธีนี้มากนัก มันเป็นแนวทางทั่วไปในเวอร์ชันเก่า
เธรดใหม่ (เรียกใช้ใหม่ () {
@แทนที่
โมฆะสาธารณะวิ่ง () {
System.out.println("เธรดที่ดำเนินการโดยคลาสภายใน");
-
}).เริ่ม();
-
โมฆะคงที่สาธารณะ main (String [] args) {
TestLambda.runThreadUseLambda();
TestLambda.runThreadUseInnerClass();
-
-
จะเห็นได้ว่าโค้ดที่ออกแบบโดยใช้นิพจน์แลมบ์ดาจะกระชับและอ่านง่ายขึ้น
3. การอ้างอิงวิธีการ
อันที่จริง มันเป็นวิธีการที่เรียบง่ายในการเขียนนิพจน์แลมบ์ดา จริงๆ แล้ววิธีการอ้างอิงคือการใช้เนื้อความของนิพจน์แลมบ์ดา ด้านซ้ายคือคอนเทนเนอร์ (อาจเป็นชื่อคลาสหรือชื่ออินสแตนซ์) ตรงกลางคือ "::" และด้านขวาคือชื่อวิธีการที่สอดคล้องกัน ดังที่แสดงด้านล่าง:
คัดลอกรหัสดังต่อไปนี้: ObjectReference::methodName
รูปแบบการอ้างอิงวิธีการทั่วไปคือ
ถ้าเป็นวิธีแบบคงที่ จะเป็น ClassName::methodName เช่น Object::equals
หากเป็นวิธีการแบบอินสแตนซ์ จะเป็น Instance::methodName เช่น Object obj=new Object();obj::equals;
ตัวสร้าง มันคือ ClassName::new
ลองดูตัวอย่างที่สมบูรณ์เพื่อความเข้าใจที่ง่ายขึ้น:
คัดลอกรหัสรหัสดังต่อไปนี้:
นำเข้า java.awt.FlowLayout;
นำเข้า java.awt.event.ActionEvent;
นำเข้า javax.swing.JButton;
นำเข้า javax.swing.JFrame;
-
-
* @ผู้เขียน benhail
-
TestMethodReference ระดับสาธารณะ {
โมฆะคงที่สาธารณะ main (String [] args) {
JFrame frame = JFrame ใหม่();
frame.setLayout(FlowLayout ใหม่());
frame.setVisible(จริง);
JButton button1 = JButton ใหม่ ("คลิกฉัน!");
JButton button2 = JButton ใหม่ ("คลิกฉันด้วย!");
frame.getContentPane().เพิ่ม(button1);
frame.getContentPane().เพิ่ม(button2);
//พารามิเตอร์ของเมธอด addActionListener ที่นี่คือ ActionListener ซึ่งเป็นอินเทอร์เฟซการทำงาน
//ใช้วิธีการแสดงออกแลมบ์ดา
button1.addActionListener(e -> { System.out.println("นี่คือการใช้งาน Lambda"); });
//ใช้วิธีการอ้างอิงวิธีการ
button2.addActionListener (TestMethodReference::doSomething);
-
-
* นี่คือวิธีการปรับใช้อินเทอร์เฟซการทำงานของ ActionListener
* @param อี
-
โมฆะคงที่สาธารณะทำอะไรบางอย่าง (ActionEvent e) {
System.out.println("นี่คือการดำเนินการอ้างอิงวิธีการ");
-
-
จะเห็นได้ว่าเมธอด doSomething คือการนำนิพจน์แลมบ์ดาไปใช้งาน ข้อดีของวิธีนี้ก็คือ หากคุณรู้สึกว่าเมธอดแลมบ์ดานั้นยาวมากและส่งผลต่อความสามารถในการอ่านโค้ด การอ้างอิงเมธอดก็เป็นวิธีแก้ปัญหา
4. สรุป
ข้างต้นเป็นเนื้อหาทั้งหมดของไวยากรณ์นิพจน์แลมบ์ดา ฉันเชื่อว่าทุกคนมีความเข้าใจเกี่ยวกับนิพจน์แลมบ์ดาอยู่แล้ว อย่างไรก็ตาม หากโค้ดนั้นเรียบง่าย Java 8 ก็คงไม่น่าตื่นเต้นนัก ต้องแนะนำ lambda ใน java 8 เพราะ lambda นิพจน์สามารถทำให้การประมวลผลข้อมูลแบบมัลติเธรดหรือมัลติคอร์ง่ายขึ้นและให้ความเร็วในการประมวลผลการรวบรวมที่เร็วขึ้น ซึ่งจะกล่าวถึงในภายหลัง คุณสมบัติของ JEP126 จะถูกแบ่งออกเป็นสามส่วน เหตุผลของการแยกเป็นเพราะคุณสมบัตินี้ มีหลายสิ่งที่จะเขียนมากเกินไป ส่วนนี้ทำให้ผู้อ่านคุ้นเคยกับไวยากรณ์และแนวคิดของนิพจน์แลมบ์ดาและการอ้างอิงวิธีการ ส่วนที่สองเป็นเรื่องเกี่ยวกับเนื้อหาของวิธีการขยายเสมือน คอลเลกชันและโซลูชันข้อมูลขนาดใหญ่ ค้นพบพลังของนิพจน์แลมบ์ดา คอยติดตาม - - -