0Pricing
Java Academy · บทเรียน

อินเทอร์เฟซเชิงฟังก์ชันแบบกำหนดเอง

กำหนดอินเทอร์เฟซของคุณเองด้วย @FunctionalInterface

อินเทอร์เฟซเชิงฟังก์ชันแบบกำหนดเอง เป็นบทเรียน Java Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Java Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Java Academy มีบทเรียนทั้งหมด 4 บทเรียน

สิ่งที่ทำให้อินเทอร์เฟซเป็นอินเทอร์เฟซเชิงฟังก์ชัน

อินเทอร์เฟซเชิงฟังก์ชันมีเมธอดนามธรรมเพียงหนึ่งเมธอดเท่านั้น (SAM) เมธอดเดียวนี้คือสิ่งที่แลมบ์ดานำไปใช้งาน

  • เมธอดค่าเริ่มต้นและเมธอดสแตติกจะไม่ถูกนับรวมในขีดจำกัดนี้
interface Greeter {
    String greet(String name);
}

public class Main {
    public static void main(String[] args) {
        Greeter g = name -> "Hello, " + name;
        System.out.println(g.greet("Ada"));
    }
}

คำอธิบายประกอบ @FunctionalInterface

@FunctionalInterface แจ้งให้คอมไพเลอร์บังคับใช้กฎเมธอดนามธรรมเพียงหนึ่งเมธอด หากคุณเพิ่มเมธอดนามธรรมที่สองโดยไม่ตั้งใจ การคอมไพล์จะล้มเหลว

@FunctionalInterface
interface Calculator {
    int compute(int a, int b);
}

public class Main {
    public static void main(String[] args) {
        Calculator add = (a, b) -> a + b;
        System.out.println(add.compute(3, 4));
    }
}

เหตุผลที่คำอธิบายประกอบมีประโยชน์

คำอธิบายประกอบนี้บันทึกเจตนาและช่วยปกป้องสัญญาการใช้งาน หากไม่มีคำอธิบายประกอบ อินเทอร์เฟซก็ยังทำงานแบบอินเทอร์เฟซเชิงฟังก์ชันได้ แต่เพื่อนร่วมทีมอาจทำให้เสียรูปแบบได้ด้วยการเพิ่มเมธอดนามธรรมอีกเมธอด

@FunctionalInterface
interface Transformer {
    String apply(String input);
}

public class Main {
    public static void main(String[] args) {
        Transformer reverse = s -> new StringBuilder(s).reverse().toString();
        System.out.println(reverse.apply("abc"));
    }
}

อินเทอร์เฟซกำหนดเองแบบเจเนอริก

อินเทอร์เฟซของคุณสามารถเป็นแบบเจเนอริกได้เช่นเดียวกับอินเทอร์เฟซที่มีมาให้ในระบบ

@FunctionalInterface
interface Converter<S, T> {
    T convert(S source);
}

public class Main {
    public static void main(String[] args) {
        Converter<String, Integer> toInt = Integer::parseInt;
        System.out.println(toInt.convert("123") + 1);
    }
}

อนุญาตให้มีเมธอดค่าเริ่มต้น

อินเทอร์เฟซเชิงฟังก์ชันอาจมีเมธอด default ได้ เมธอดเหล่านี้เพิ่มพฤติกรรมโดยไม่ทำลายกฎเมธอดนามธรรมเพียงหนึ่งเมธอด

@FunctionalInterface
interface Operation {
    int apply(int x);

    default Operation then(Operation next) {
        return x -> next.apply(this.apply(x));
    }
}

public class Main {
    public static void main(String[] args) {
        Operation inc = x -> x + 1;
        Operation dbl = x -> x * 2;
        System.out.println(inc.then(dbl).apply(5));
    }
}

อนุญาตให้มีเมธอดสแตติกด้วย

เมธอดสแตติกสามารถทำหน้าที่เป็นโรงงานได้ คล้ายกับ Function.identity()

@FunctionalInterface
interface Mapper {
    int map(int x);

    static Mapper identity() {
        return x -> x;
    }
}

public class Main {
    public static void main(String[] args) {
        System.out.println(Mapper.identity().map(99));
    }
}

การโยนข้อยกเว้นที่ตรวจสอบได้

หากเมธอดนามธรรมของคุณประกาศข้อยกเว้นที่ตรวจสอบได้ แลมบ์ดาก็อาจโยนข้อยกเว้นนั้นได้ Function ที่มีมาให้ในระบบทำเช่นนี้ไม่ได้ ซึ่งเป็นเหตุผลหนึ่งที่คุณควรกำหนดอินเทอร์เฟซของคุณเอง

@FunctionalInterface
interface RiskyParser {
    int parse(String s) throws NumberFormatException;
}

public class Main {
    public static void main(String[] args) {
        RiskyParser p = Integer::parseInt;
        System.out.println(p.parse("77"));
    }
}

การส่งอินเทอร์เฟซกำหนดเองให้เมธอด

อินเทอร์เฟซของคุณจะกลายเป็นชนิดของพารามิเตอร์ ทำให้ผู้เรียกใช้สามารถส่งพฤติกรรมผ่านแลมบ์ดาได้

@FunctionalInterface
interface IntCombiner {
    int combine(int a, int b);
}

public class Main {
    static int reduce(int[] arr, IntCombiner c) {
        int acc = arr[0];
        for (int i = 1; i < arr.length; i++) acc = c.combine(acc, arr[i]);
        return acc;
    }

    public static void main(String[] args) {
        int[] data = {1, 2, 3, 4};
        System.out.println(reduce(data, (a, b) -> a + b));
    }
}

อินเทอร์เฟซแบบสามอาร์กิวเมนต์

JDK มีอินเทอร์เฟซสำหรับอาร์กิวเมนต์เดียวและสองอาร์กิวเมนต์มาให้เท่านั้น หากต้องการใช้อาร์กิวเมนต์สามรายการขึ้นไป ให้กำหนดอินเทอร์เฟซของคุณเอง

@FunctionalInterface
interface TriFunction<A, B, C, R> {
    R apply(A a, B b, C c);
}

public class Main {
    public static void main(String[] args) {
        TriFunction<Integer, Integer, Integer, Integer> sum3 = (a, b, c) -> a + b + c;
        System.out.println(sum3.apply(1, 2, 3));
    }
}

การอ้างอิงเมธอดใช้กับอินเทอร์เฟซกำหนดเองได้

เมธอดใดก็ตามที่มีลายเซ็นตรงกับ SAM สามารถส่งให้ใช้งานในรูปการอ้างอิงเมธอดได้

@FunctionalInterface
interface StringTest {
    boolean check(String s);
}

public class Main {
    public static void main(String[] args) {
        StringTest blank = String::isBlank;
        System.out.println(blank.check("   "));
    }
}

คลาสไม่ระบุชื่อเทียบกับแลมบ์ดา

แลมบ์ดาเป็นรูปแบบกระชับที่ใช้แทนคลาสไม่ระบุชื่อซึ่งนำอินเทอร์เฟซเชิงฟังก์ชันไปใช้งาน ทั้งสองแบบให้พฤติกรรมเหมือนกัน

@FunctionalInterface
interface Action {
    void run();
}

public class Main {
    public static void main(String[] args) {
        Action old = new Action() {
            public void run() { System.out.println("anonymous"); }
        };
        Action neo = () -> System.out.println("lambda");
        old.run();
        neo.run();
    }
}

ตรวจสอบอย่างรวดเร็ว

@FunctionalInterface รับประกันอะไร

สรุปทบทวน

คุณได้กำหนดอินเทอร์เฟซเชิงฟังก์ชันของคุณเอง:

  • อินเทอร์เฟซเชิงฟังก์ชันมีเมธอดนามธรรมเพียงหนึ่งเมธอดเท่านั้น (SAM)
  • @FunctionalInterface บังคับใช้กฎนี้ขณะคอมไพล์
  • อนุญาตให้มีเมธอดค่าเริ่มต้นและเมธอดสแตติก เจเนอริก และข้อยกเว้นที่ตรวจสอบได้
  • อินเทอร์เฟซกำหนดเองช่วยเติมส่วนที่ JDK ไม่ครอบคลุม เช่น ฟังก์ชันแบบสามอาร์กิวเมนต์หรือแลมบ์ดาที่โยนข้อยกเว้นที่ตรวจสอบได้

คำถามที่พบบ่อย

บทเรียน “อินเทอร์เฟซเชิงฟังก์ชันแบบกำหนดเอง” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “อินเทอร์เฟซเชิงฟังก์ชันแบบกำหนดเอง” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Java Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Java Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “อินเทอร์เฟซเชิงฟังก์ชันแบบกำหนดเอง”

กำหนดอินเทอร์เฟซของคุณเองด้วย @FunctionalInterface คุณปฏิบัติ Java Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Java Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน Java Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน

บทเรียน “อินเทอร์เฟซเชิงฟังก์ชันแบบกำหนดเอง” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน Java Academy นี้ได้ไหม

ได้ บทเรียน Java Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. Function และ BiFunction
  2. Supplier และ Consumer
  3. Predicate และการประกอบ
  4. อินเทอร์เฟซเชิงฟังก์ชันแบบกำหนดเอง
← กลับไปที่ Java Academy