嵌套 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 反馈 — 无需本地设置。
此课程中的所有课时
- instanceof 的模式匹配
- Record 模式
- 嵌套 Record 模式
- switch 中的模式