0Pricing
Java Academy · 课时

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 反馈 — 无需本地设置。

此课程中的所有课时

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