อินเทอร์เฟซเชิงฟังก์ชันแบบกำหนดเอง
กำหนดอินเทอร์เฟซของคุณเองด้วย @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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- Function และ BiFunction
- Supplier และ Consumer
- Predicate และการประกอบ
- อินเทอร์เฟซเชิงฟังก์ชันแบบกำหนดเอง