อินเทอร์เฟซการทำงานใน Java เป็นอินเทอร์เฟซที่มีวิธีนามธรรมเพียง 1 วิธี วัตถุประสงค์หลักคือเพื่อใช้ในนิพจน์แลมบ์ดาและการอ้างอิงเมธอด
การมีอยู่ของวิธีนามธรรม 1 วิธีเป็นเงื่อนไขเดียว ดังนั้นอินเทอร์เฟซการทำงานจึงสามารถมี
ฉันจะไม่พูดถึงพวกเขาอย่างละเอียด ฉันทราบว่าที่ใช้บ่อยที่สุดคือ: Consumer<T> , Function<T,R> , Predicate<T> , Supplier<T> , UnaryOperator<T>และแบบฟอร์มBi ของพวกเขา รายละเอียดเพิ่มเติมสามารถพบได้ในหน้าเอกสารประกอบ: Package java.util.function
default
วิธีการstatic
ได้ คุณสามารถเพิ่มคำอธิบายประกอบ @FunctionalInterface ให้กับอินเทอร์เฟซการทำงานได้ สิ่งนี้ไม่จำเป็น แต่หากมีคำอธิบายประกอบนี้ โค้ดจะไม่คอมไพล์หากมีวิธีนามธรรมมากกว่าหรือน้อยกว่า 1 วิธี แนะนำให้เพิ่ม @FunctionalInterface สิ่งนี้จะช่วยให้คุณใช้อินเทอร์เฟซในนิพจน์แลมบ์ดาได้โดยไม่ต้องกังวลว่าจะมีใครบางคนเพิ่มวิธีนามธรรมใหม่ให้กับอินเทอร์เฟซ และอินเทอร์เฟซจะหยุดทำงาน Java มีอินเทอร์เฟซการทำงานในตัวซึ่งอยู่ในไฟล์java.util.function
.
มีอะไรให้อ่านอีก: |
---|
import java.util.function.Predicate;
//Определяем свой функциональный интерфейс
@FunctionalInterface
interface MyPredicate {
boolean test(Integer value);
}
public class Tester {
public static void main(String[] args) throws Exception {
MyPredicate myPredicate = x -> x > 0;
System.out.println(myPredicate.test(10)); //true
//Аналогично, но используется встроенный функциональный интерфейс java.util.function.Predicate
Predicate<Integer> predicate = x -> x > 0;
System.out.println(predicate.test(-10)); //false
}
}
แต่ปรากฎว่ามีจุดละเอียดอ่อนจุดหนึ่งที่อธิบายไว้ในข้อกำหนดภาษา Java: “อินเทอร์เฟซไม่ได้รับการสืบทอดจาก Object แต่ค่อนข้างจะประกาศวิธีการเดียวกันกับ Object หลายวิธีโดยปริยาย” ซึ่งหมายความว่าส่วนต่อประสานการทำงานสามารถมีวิธีการเชิงนามธรรมเพิ่มเติมที่กำหนดไว้ในคลาสObject
ได้ รหัสด้านล่างถูกต้อง จะไม่มีข้อผิดพลาดในการคอมไพล์หรือรันไทม์:
@FunctionalInterface
public interface Comparator<T> {
int compare(T o1, T o2);
boolean equals(Object obj);
// другие default or static методы
}
ระมัดระวังในการสัมภาษณ์! ขอให้โชคดี!
GO TO FULL VERSION