Record 模式
在模式中解构 Record
Record 模式 是 CoddyKit 上的免费 Java Academy 课时。 这是第 2 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Java Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Java Academy 课程共包含 4 节课。
记录模式
记录模式可以匹配一个记录并对其进行解构,一步将其组件绑定到变量。不必再手动调用每个访问器。
要解构的记录
从一个简单的记录开始。它的组件就是模式可以提取的内容。
public class Main {
record Point(int x, int y) {}
public static void main(String[] args) {
Point p = new Point(3, 4);
System.out.println(p.x() + ", " + p.y());
}
}使用 instanceof 进行解构
不必先使用 instanceof Point p,再调用 p.x();您可以写成 instanceof Point(int x, int y),直接绑定 x 和 y。
public class Main {
record Point(int x, int y) {}
public static void main(String[] args) {
Object obj = new Point(3, 4);
if (obj instanceof Point(int x, int y)) {
System.out.println("Sum: " + (x + y));
}
}
}组件变成本地变量
模式中的名称(x、y)是新的局部变量,保存着记录组件的值。名称由您选择,不必与记录中的名称一致。
public class Main {
record Point(int x, int y) {}
public static void main(String[] args) {
Object obj = new Point(10, 20);
if (obj instanceof Point(int a, int b)) {
System.out.println("a=" + a + " b=" + b);
}
}
}在模式中使用类型推断
您可以为组件写 var,让编译器推断其类型;当类型名称很长时,这会很方便。
public class Main {
record Pair(String key, Integer value) {}
public static void main(String[] args) {
Object obj = new Pair("age", 30);
if (obj instanceof Pair(var key, var value)) {
System.out.println(key + " = " + value);
}
}
}分支选择中的模式
记录模式同样可以用于分支选择,让各个分支看起来就像是在描述数据形状。
public class Main {
record Point(int x, int y) {}
static String classify(Object obj) {
return switch (obj) {
case Point(int x, int y) when x == y -> "on diagonal";
case Point(int x, int y) -> "at " + x + "," + y;
default -> "not a point";
};
}
public static void main(String[] args) {
System.out.println(classify(new Point(5, 5)));
System.out.println(classify(new Point(1, 2)));
}
}类型推断匹配
模式中的组件类型必须与记录声明的类型兼容。使用准确的类型或 var 是安全的选择。
与守卫条件结合
在记录模式后添加 when 守卫,使模式仅在解构出的值满足某个条件时匹配。
public class Main {
record Temperature(double celsius) {}
static String alert(Object o) {
if (o instanceof Temperature(double c) && c > 38.0) {
return "fever: " + c;
}
return "normal";
}
public static void main(String[] args) {
System.out.println(alert(new Temperature(39.5)));
System.out.println(alert(new Temperature(36.6)));
}
}更简洁的数据访问
当您只需要几个字段时,记录模式尤其有用。它消除了连续的访问器调用,并使匹配位置所需的相关数据一目了然。
空值与记录模式
与所有 instanceof 模式一样,记录模式对空值为 false。只有确认值是记录的非空实例后,才会进行解构。
实际示例
通过解构直接根据组件计算一个值。
public class Main {
record Rectangle(int width, int height) {}
static int area(Object o) {
if (o instanceof Rectangle(int w, int h)) {
return w * h;
}
return 0;
}
public static void main(String[] args) {
System.out.println(area(new Rectangle(4, 5)));
System.out.println(area("not a rect"));
}
}快速检查
检验您对记录模式的理解。
回顾
您学习了记录模式。
- 它们会同时检查记录类型并解构其组件。
- 组件名称是由您选择的新局部变量;
var会推断类型。 - 它们既可用于
instanceof,也可用于分支选择。 - 与所有模式一样,它们对空值为 false。
常见问题解答
「Record 模式」课时是免费的吗?
是的 — 「Record 模式」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Java Academy 课程的其余内容,请升级到 CoddyKit PRO。 Java Academy 课程共包含 4 节课。
「Record 模式」这节课中我会学到什么?
在模式中解构 Record 你通过在浏览器中直接运行的动手代码来练习 Java Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 Java Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 Java Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 2 节课,共 4 节。
「Record 模式」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 Java Academy 课中编写并运行代码吗?
能。每节 Java Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。