JavaRush /จาวาบล็อก /Random-TH /อินเทอร์เฟซการทำงานของ Java
Алексей
ระดับ

อินเทอร์เฟซการทำงานของ Java

เผยแพร่ในกลุ่ม
อินเทอร์เฟซการทำงานใน Java เป็นอินเทอร์เฟซที่มีวิธีนามธรรมเพียง 1 วิธี วัตถุประสงค์หลักคือเพื่อใช้ในนิพจน์แลมบ์ดาและการอ้างอิงเมธอด
อินเทอร์เฟซการทำงานของ Java - 1
การมีอยู่ของวิธีนามธรรม 1 วิธีเป็นเงื่อนไขเดียว ดังนั้นอินเทอร์เฟซการทำงานจึงสามารถมีdefaultวิธีการstaticได้ คุณสามารถเพิ่มคำอธิบายประกอบ @FunctionalInterface ให้กับอินเทอร์เฟซการทำงานได้ สิ่งนี้ไม่จำเป็น แต่หากมีคำอธิบายประกอบนี้ โค้ดจะไม่คอมไพล์หากมีวิธีนามธรรมมากกว่าหรือน้อยกว่า 1 วิธี แนะนำให้เพิ่ม @FunctionalInterface สิ่งนี้จะช่วยให้คุณใช้อินเทอร์เฟซในนิพจน์แลมบ์ดาได้โดยไม่ต้องกังวลว่าจะมีใครบางคนเพิ่มวิธีนามธรรมใหม่ให้กับอินเทอร์เฟซ และอินเทอร์เฟซจะหยุดทำงาน Java มีอินเทอร์เฟซการทำงานในตัวซึ่งอยู่ในไฟล์java.util.function. ฉันจะไม่พูดถึงพวกเขาอย่างละเอียด ฉันทราบว่าที่ใช้บ่อยที่สุดคือ: Consumer<T> , Function<T,R> , Predicate<T> , Supplier<T> , UnaryOperator<T>และแบบฟอร์มBi ของพวกเขา รายละเอียดเพิ่มเติมสามารถพบได้ในหน้าเอกสารประกอบ: Package 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 методы
}
ระมัดระวังในการสัมภาษณ์! ขอให้โชคดี!
ความคิดเห็น
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION