กรุณาอย่าเกรียนมากเกินไป ฉันเพิ่งเริ่มแปลบทความ
อินเทอร์เฟซสามารถสืบทอดจากอินเทอร์เฟซอื่น หากอินเทอร์เฟซสืบทอดจากอินเทอร์เฟซที่ใช้งานได้และไม่มีวิธีนามธรรมใหม่ อินเทอร์เฟซนี้ก็ใช้งานได้เช่นกัน แต่อินเทอร์เฟซสามารถมีวิธีนามธรรมได้วิธีเดียวและวิธีการเริ่มต้นหลายวิธีเท่านั้น และจะยังคงถือว่าใช้งานได้
นี่เป็นการแนะนำโดยย่อเกี่ยวกับแนวคิดของอินเทอร์เฟซการทำงานใน Java 8 และวิธีการนำไปใช้งาน โดยใช้นิพจน์แลมบ์ดา
ข้อมูลเบื้องต้นเกี่ยวกับอินเทอร์เฟซการทำงาน - แนวคิดที่สร้างขึ้นใหม่ใน Java 8
นักพัฒนา Java ทุกคนในโลกได้ใช้หนึ่งในอินเทอร์เฟซต่อไปนี้อย่างน้อยหนึ่งครั้ง:java.lang.Runnable
, java.awt.event.ActionListener
, java.util.Comparator
, java.util.concurrent.Callable
. พวกเขาทั้งหมดมีสิ่งหนึ่งที่เหมือนกัน และนั่นคือพวกเขาทั้งหมดมีเพียงวิธีเดียวเท่านั้น มีอินเทอร์เฟซดังกล่าวอื่นๆ อีกมากมายใน JDK รวมถึงอินเทอร์เฟซอื่นๆ ที่สร้างโดยนักพัฒนา Java อินเทอร์เฟซเหล่านี้เรียกอีกอย่างว่าSingle Abstract Method interfaces
(อินเทอร์เฟซ SAM) หนึ่งในวิธีที่ได้รับความนิยมมากที่สุดในการใช้อินเทอร์เฟซเหล่านี้คือการสร้างคลาสภายในที่ไม่ระบุชื่อที่ใช้อินเทอร์เฟซเหล่านี้ ดังตัวอย่างต่อไปนี้:
public class AnonymousInnerClassTest {
public static void main(String[] args) {
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("A thread created and running...");
}
}).start();
}
}
ใน Java 8 แนวคิด SAM จะถูกสร้างขึ้นใหม่และเรียกว่าอินเทอร์เฟซการทำงาน สามารถแสดงได้โดยใช้นิพจน์แลมบ์ดา การอ้างอิงเมธอด และตัวสร้างการอ้างอิง คำอธิบายประกอบ @FunctionalInterface ใหม่ได้ถูกสร้างขึ้นซึ่งใช้ในการส่งข้อผิดพลาดในระดับคอมไพเลอร์เมื่ออินเทอร์เฟซที่คุณใส่คำอธิบายประกอบไม่ทำงานในระดับการทำงาน มาดูอินเทอร์เฟซการทำงานที่เรียบง่ายด้วยวิธีนามธรรมวิธีเดียว:
@FunctionalInterface
public interface SimpleFunInterface {
public void doWork();
}
อินเทอร์เฟซยังสามารถประกาศวิธีการเชิงนามธรรมจากคลาสได้java.lang.Object
แต่ในกรณีนี้ อินเทอร์เฟซยังสามารถประกาศได้ว่าใช้งานได้:
@FunctionalInterface
public interface SimpleFuncInterface {
public void doWork();
public String toString();
public Boolean equals(Object o);
}
ทันทีที่คุณเพิ่มวิธีนามธรรมอื่นให้กับอินเทอร์เฟซ IDE จะทำเครื่องหมายว่ามีข้อผิดพลาดดังในภาพ: 
มีอะไรให้อ่านอีก: |
---|
@FunctionalInterface
public interface ComplexFunctionalInterface extends SimpleFuncInterface {
default public void doSomeWork() {
System.out.println("Doing some work in interface impl...");
}
default public void doSomeWork() {
System.out.println("Doing some other work in interface impl...");
}
}
ตัวอย่างบนสุดยังคงเป็นอินเทอร์เฟซที่ใช้งานได้ ตอนนี้เรามาดูกันว่าเราจะใช้นิพจน์แลมบ์ดาเพื่อแทนที่คลาสภายในที่ไม่ระบุตัวตนเพื่อใช้อินเทอร์เฟซการทำงานได้อย่างไร:
/*
*Implementation the interface by creating an
*anonymoous inner class versus using
*lambda expression.
*/
public class SimpleFunInterfaceTest {
public static void main(String[] args) {
carryOutWork(new SimpleFunInterface() {
@Override
public void doWork() {
System.out.println("Do work in SimpleFun impl...");
}
});
carryOutWork(() -> System.out.println("Do work in lambda exp impl..."));
}
public static void carryOutWork(SimpleFuncInterface sfi) {
sfi.work();
}
}
ผลลัพธ์ของโปรแกรมจะเป็นดังนี้:
Do work in SimpleFun impl...
Do work in lambda exp impl...
ในกรณีที่คุณใช้ IDE ที่รองรับไวยากรณ์นิพจน์แลมบ์ดา Java (Netbeans 8 Nightly builds) – คุณจะได้รับคำแนะนำเมื่อใช้คลาสภายในที่ไม่ระบุชื่อ: 
GO TO FULL VERSION