0Pricing
Java Academy · 课时

嵌套 Record 模式

匹配深层嵌套的数据

嵌套 Record 模式 是 CoddyKit 上的免费 Java Academy 课时。 这是第 3 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Java Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Java Academy 课程共包含 4 节课。

嵌套记录模式

记录模式可以嵌套:如果某个组件本身也是记录,就可以在外层模式内部对它进行解构。这样可以在一个表达式中匹配深层结构化数据。

嵌套的数据模型

请考虑由两个 Point 记录组成的 Line。其中的内部记录很适合进行嵌套。

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。
  • 只有每一层都匹配时,整体匹配才会成功。
  • 内部绑定可以同时用于守卫和主体。

常见问题解答

「嵌套 Record 模式」课时是免费的吗?

是的 — 「嵌套 Record 模式」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Java Academy 课程的其余内容,请升级到 CoddyKit PRO。 Java Academy 课程共包含 4 节课。

「嵌套 Record 模式」这节课中我会学到什么?

匹配深层嵌套的数据 你通过在浏览器中直接运行的动手代码来练习 Java Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 Java Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 Java Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 3 节课,共 4 节。

「嵌套 Record 模式」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 Java Academy 课中编写并运行代码吗?

能。每节 Java Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. instanceof 的模式匹配
  2. Record 模式
  3. 嵌套 Record 模式
  4. switch 中的模式
← 返回 Java Academy