ด้านล่างเรายังคงดำน้ำในรูปแบบการเขียนโปรแกรม Java8 ที่ใช้งานได้
การทดสอบระดับสาธารณะ 1 {โมฆะคงที่สาธารณะหลัก (สตริง [] args) {รายการ <teger> list = array.aslist (1,2,3,4,5,6,7,7,8,9,10); list.foreach (ผู้บริโภคใหม่ <Integer> () {@Override โมฆะสาธารณะยอมรับ (จำนวนเต็มจำนวนเต็ม) {System.out.println (จำนวนเต็ม);}}); -โปรแกรมนี้ง่ายก่อนเริ่มต้นการรวบรวมประเภทจำนวนเต็มจากนั้นส่งออกแต่ละองค์ประกอบไปยังคอนโซล ในหมู่พวกเขาเราสังเกตเห็นวิธี foreach ซึ่งเป็นวิธีการเริ่มต้นที่เพิ่มขึ้นใหม่ใน Java 8
อินเทอร์เฟซสาธารณะ iterable <t> { - ละเว้น. ช่องว่างเริ่มต้น foreach (ผู้บริโภค <? super t> การกระทำ) {objects.requirenonnull (การกระทำ); สำหรับ (t t: this) {action.accept (t); -มีการประกาศในอินเทอร์เฟซที่วนซ้ำและได้รับการแก้ไขโดยค่าเริ่มต้นของคำหลัก ด้วยวิธีนี้ชนิดย่อยใด ๆ ของอินเทอร์เฟซนี้สามารถสืบทอดการใช้วิธี foreach ดังนั้นอินเทอร์เฟซรายการจึงเป็นส่วนย่อยทางอ้อมของการวนซ้ำดังนั้นจึงสืบทอดวิธีเริ่มต้น Java8 ใช้วิธีที่ฉลาดนี้ในการขยายฟังก์ชั่นของอินเทอร์เฟซและเข้ากันได้กับเวอร์ชันเก่า
ต่อไปเราวิเคราะห์การใช้งาน foreach ก่อนอื่นเราได้รับการกระทำพารามิเตอร์ของประเภทผู้บริโภคดำเนินการตัดสินที่ไม่ว่างเปล่าจากนั้นสำรวจองค์ประกอบปัจจุบันทั้งหมดและส่งให้กับวิธีการยอมรับของการดำเนินการสำหรับการประมวลผล แล้วผู้บริโภคคืออะไร? ดูที่ซอร์สโค้ด
@functionalInterfacepublic Interface Consumer <t> { /*** ดำเนินการนี้ในอาร์กิวเมนต์ที่กำหนด * * @param t อาร์กิวเมนต์อินพุต */ เป็นโมฆะยอมรับ (t t); - .mitted.} อินเทอร์เฟซที่มีวิธีนามธรรมเพียงวิธีเดียวจะถูกแก้ไขโดย @functionalInterface ซึ่งเป็นอินเตอร์เฟสการทำงานทั่วไป
ตกลงตอนนี้เรารู้แล้วว่าพารามิเตอร์ของประเภทผู้บริโภคที่ได้รับจาก Foreach เป็นอินเทอร์เฟซที่ใช้งานได้ วิธีการที่ยอมรับได้เพียงอย่างเดียวในอินเตอร์เฟสจะได้รับพารามิเตอร์และไม่ส่งคืนค่า จากบทความก่อนหน้านี้เรารู้ว่าวิธีหนึ่งในการสร้างอินสแตนซ์ของประเภทอินเตอร์เฟสการทำงานคือการใช้นิพจน์แลมบ์ดาดังนั้นคุณสามารถแปลงโปรแกรมด้านบน
การทดสอบระดับสาธารณะ 1 {โมฆะคงที่สาธารณะหลัก (สตริง [] args) {รายการ <teger> list = array.aslist (1,2,3,4,5,6,7,7,8,9,10); // นิพจน์แลมบ์ดาได้รับพารามิเตอร์โดยไม่ต้องส่งคืนรายการค่า foreach (รายการ -> system.out.println (รายการ)); - รายการนิพจน์แลมบ์ดา -> system.out.println (รายการ) ได้รับพารามิเตอร์โดยไม่ต้องส่งคืนค่าและตรงตามข้อกำหนดของลายเซ็นวิธีการยอมรับและรวบรวมและผ่าน
กล่าวคือหากมีการใช้นิพจน์แลมบ์ดาเพื่อสร้างอินสแตนซ์อินเทอร์เฟซที่ใช้งานได้พารามิเตอร์รายการและการกลับมาของนิพจน์แลมบ์ดานี้จะต้องสอดคล้องกับลายเซ็นวิธีการของวิธีนามธรรมเพียงอย่างเดียวในอินเทอร์เฟซการทำงานนี้
ถัดไปโปรแกรมจะได้รับการแก้ไข
การทดสอบระดับสาธารณะ 1 {โมฆะคงที่สาธารณะหลัก (สตริง [] args) {รายการ <teger> list = array.aslist (1,2,3,4,5,6,7,7,8,9,10); // วิธีการอ้างอิงวิธีการ foreach (system.out :: println); - ฉันเห็นสองโคโลนที่อยู่ข้างหลัง แต่ฉันก็ยุ่งเหยิงอยู่ดี - - นี่เป็นวิธีที่สองในการสร้างอินสแตนซ์อินเทอร์เฟซที่ใช้งานได้: วิธีการอ้างอิงวิธีการอ้างอิงไวยากรณ์คือ Object :: Method Name
ในทำนองเดียวกันการใช้วิธีการอ้างอิงวิธีการเพื่อสร้างอินสแตนซ์อินเทอร์เฟซที่ใช้งานได้จะต้องปฏิบัติตามคำจำกัดความของลายเซ็นวิธี ดูซอร์สโค้ดวิธีการพิมพ์ที่นี่
โมฆะสาธารณะ println (วัตถุ x) {string s = string.valueof (x); ซิงโครไนซ์ (สิ่งนี้) {print (s); newline (); - รับพารามิเตอร์และไม่ส่งคืนค่าและรวบรวมผ่าน
สุดท้ายมาดูประเภทสุดท้ายของการสร้างอินเทอร์เฟซที่ใช้งานได้ วิธีที่สาม: สร้างการอ้างอิงวิธีการและดำเนินการต่อเพื่อแก้ไขโปรแกรม
การทดสอบระดับสาธารณะ 1 {โมฆะคงที่สาธารณะหลัก (สตริง [] args) {รายการ <teger> list = array.aslist (1,2,3,4,5,6,7,7,8,9,10); // รายการอ้างอิงวิธีการสร้างรายการ foreach (test1 :: ใหม่); } test1 (จำนวนเต็ม i) {system.out.println (i); - ไวยากรณ์ที่อ้างอิงโดยตัวสร้างคือ: ชื่อคลาส :: ใหม่
เราได้เพิ่มตัวสร้างใหม่ลงใน Test1 ซึ่งได้รับพารามิเตอร์ไม่ส่งคืนค่าและรวบรวมผ่าน (เพื่อแสดงการใช้การอ้างอิงตัวสร้างเท่านั้น)
จากบทความก่อนหน้านี้เราสามารถสรุปสามวิธีในการสร้างประเภทอินเทอร์เฟซที่ใช้งานได้:
1. การแสดงออกของแลมบ์ดา
2. การอ้างอิงวิธีการ
3. การอ้างอิงวิธีการสร้าง
หมายเหตุ: ไม่ว่าวิธีใดลายเซ็นวิธีการจะต้องสอดคล้องกับวิธีนามธรรม