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

รูปแบบเรคคอร์ดซ้อน

จับคู่ข้อมูลที่ซ้อนกันหลายชั้น

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

รูปแบบเรคคอร์ดซ้อนกัน

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

แบบจำลองข้อมูลที่ซ้อนกัน

พิจารณา Line ที่ประกอบด้วยเรคคอร์ด Point สองรายการ เรคคอร์ดด้านในเหมาะอย่างยิ่งสำหรับการนำมาซ้อนกัน

public class Main {
    record Point(int x, int y) {}
    record Line(Point start, Point end) {}

    public static void main(String[] args) {
        Line line = new Line(new Point(0, 0), new Point(3, 4));
        System.out.println(line);
    }
}

การแยกโครงสร้างหนึ่งระดับ

รูปแบบแบบแบนจะผูกองค์ประกอบ Point สองรายการไว้ แต่ยังคงเก็บแต่ละรายการไว้ทั้งชุด

public class Main {
    record Point(int x, int y) {}
    record Line(Point start, Point end) {}

    public static void main(String[] args) {
        Object obj = new Line(new Point(0, 0), new Point(3, 4));
        if (obj instanceof Line(Point s, Point e)) {
            System.out.println(s + " -> " + e);
        }
    }
}

ลงลึกกว่าเดิม

แทนที่ Point s ด้านในด้วยรูปแบบเรคคอร์ดของตัวเอง เพื่อเข้าถึงพิกัดโดยตรง: Line(Point(int x1, int y1), Point(int x2, int y2))

public class Main {
    record Point(int x, int y) {}
    record Line(Point start, Point end) {}

    public static void main(String[] args) {
        Object obj = new Line(new Point(0, 0), new Point(3, 4));
        if (obj instanceof Line(Point(int x1, int y1), Point(int x2, int y2))) {
            double len = Math.hypot(x2 - x1, y2 - y1);
            System.out.println("Length: " + len);
        }
    }
}

ลึกได้ทุกระดับ

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

public class Main {
    record Point(int x, int y) {}
    record Line(Point start, Point end) {}
    record Drawing(Line first, String label) {}

    public static void main(String[] args) {
        Object obj = new Drawing(new Line(new Point(1, 2), new Point(3, 4)), "diag");
        if (obj instanceof Drawing(Line(Point(var ax, var ay), var end), var label)) {
            System.out.println(label + " starts at " + ax + "," + ay);
            System.out.println("ends near " + end);
        }
    }
}

การผสม var กับชนิดที่ระบุ

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

การซ้อนรูปแบบในคำสั่งสวิตช์

รูปแบบที่ซ้อนกันแสดงความหมายได้ชัดเจนเป็นพิเศษในคำสั่งสวิตช์ ทำให้แต่ละกรณีบรรยายรูปร่างข้อมูลที่เฉพาะเจาะจงได้

public class Main {
    record Point(int x, int y) {}
    record Line(Point start, Point end) {}

    static String describe(Object o) {
        return switch (o) {
            case Line(Point(var x1, var y1), Point(var x2, var y2)) when x1 == x2 -> "vertical";
            case Line(Point p1, Point p2) -> "general line";
            default -> "not a line";
        };
    }

    public static void main(String[] args) {
        System.out.println(describe(new Line(new Point(2, 0), new Point(2, 9))));
        System.out.println(describe(new Line(new Point(0, 0), new Point(5, 5))));
    }
}

การจับคู่ทั้งหมดต้องสำเร็จ

รูปแบบที่ซ้อนกันจะจับคู่ได้ก็ต่อเมื่อทุกระดับจับคู่ได้ หากองค์ประกอบใดมีชนิดต่างจากที่รูปแบบย่อยคาดไว้ การจับคู่ทั้งหมดจะล้มเหลวและจะไม่มีการผูกตัวแปรใด ๆ

ข้อแลกเปลี่ยนด้านความอ่านง่าย

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

เงื่อนไขกำกับเหนือการผูกค่าที่ซ้อนกัน

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

public class Main {
    record Point(int x, int y) {}
    record Line(Point start, Point end) {}

    static boolean isUnitStep(Object o) {
        return o instanceof Line(Point(int x1, int y1), Point(int x2, int y2))
            && x2 - x1 == 1 && y2 - y1 == 1;
    }

    public static void main(String[] args) {
        System.out.println(isUnitStep(new Line(new Point(0, 0), new Point(1, 1))));
        System.out.println(isUnitStep(new Line(new Point(0, 0), new Point(2, 2))));
    }
}

ตัวอย่างที่สมบูรณ์

คำนวณจุดกึ่งกลางของเส้นด้วยการแยกโครงสร้างจุดปลายทั้งสอง

public class Main {
    record Point(int x, int y) {}
    record Line(Point start, Point end) {}

    static Point midpoint(Object o) {
        if (o instanceof Line(Point(int x1, int y1), Point(int x2, int y2))) {
            return new Point((x1 + x2) / 2, (y1 + y2) / 2);
        }
        return null;
    }

    public static void main(String[] args) {
        System.out.println(midpoint(new Line(new Point(0, 0), new Point(4, 6))));
    }
}

ตรวจสอบความเข้าใจอย่างรวดเร็ว

ทดสอบความเข้าใจของคุณเกี่ยวกับรูปแบบเรคคอร์ดที่ซ้อนกัน

สรุปทบทวน

คุณได้เรียนรู้รูปแบบเรคคอร์ดที่ซ้อนกัน

  • องค์ประกอบของเรคคอร์ดที่เป็นเรคคอร์ดอยู่แล้วสามารถแยกโครงสร้างภายในรูปแบบได้ทันที
  • การซ้อนกันทำได้ทุกระดับ และผสมชนิดที่ระบุชัดเจนกับ var ได้
  • การจับคู่จะสำเร็จก็ต่อเมื่อทุกระดับจับคู่ได้
  • ค่าที่ผูกไว้ด้านในสามารถใช้ได้ทั้งในเงื่อนไขกำกับและในเนื้อหาของแขนง

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

บทเรียน “รูปแบบเรคคอร์ดซ้อน” ฟรีหรือไม่

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

คุณจะเรียนรู้อะไรในบทเรียน “รูปแบบเรคคอร์ดซ้อน”

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

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

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

บทเรียน “รูปแบบเรคคอร์ดซ้อน” ใช้เวลานานแค่ไหน

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

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

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

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

  1. การจับคู่รูปแบบสำหรับ instanceof
  2. รูปแบบเรคคอร์ด
  3. รูปแบบเรคคอร์ดซ้อน
  4. รูปแบบใน switch
← กลับไปที่ Java Academy