You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java 22中如何对嵌套记录进行模式匹配并命名匹配对象?

在Java中为嵌套模式匹配的对象命名的简洁写法

你给出的Java代码场景中,通过嵌套record实现密封接口,在switch模式匹配时希望直接引用嵌套的Inner和InnerInner对象,而非通过多层嵌套switch获取:

sealed interface Uninteresting permits Outer, Inner, InnerInner{ }

record Outer(Inner inner, int x) implements Uninteresting { }

record Inner(InnerInner innerInner, int y) implements Uninteresting { }

record InnerInner(int z) implements Uninteresting { }

void test() {
    var outer = new Outer(new Inner(new InnerInner(3), 4), 2);
    switch (outer) {
        case Outer(Inner(InnerInner(var z), var y), var x) -> {
            System.out.println(z);
            System.out.println(y);
            System.out.println(x);
            System.out.println(outer);
            System.out.println(i); // <- 如何引用Inner对象? 
            System.out.println(ii); // <- 如何引用InnerInner对象?
        }
    }
}

你目前通过嵌套switch实现了对象引用,但写法较为繁琐:

switch (outer) {
    case Outer(var i, var x) -> {
        switch (i) {
            case Inner(var ii, var y) -> {
                switch (ii) {
                    case InnerInner(var z) -> {
                        System.out.println(z);
                        System.out.println(y);
                        System.out.println(x);
                        System.out.println(outer);
                        System.out.println(i);
                        System.out.println(ii);
                    }
                }
            }
        }
    }
}

Scala可以通过i@Inner这类语法直接在嵌套匹配中为对象命名,Java在**Java 17及以上版本(Java 16为预览特性)也支持类似的模式绑定(Pattern Binding)**语法,写法和Scala高度相似:

void test() {
    var outer = new Outer(new Inner(new InnerInner(3), 4), 2);
    switch (outer) {
        case Outer(var i@Inner(var ii@InnerInner(var z), var y), var x) -> {
            System.out.println(z);
            System.out.println(y);
            System.out.println(x);
            System.out.println(outer);
            System.out.println(i); // 直接引用Inner对象
            System.out.println(ii); // 直接引用InnerInner对象
        }
    }
}

这里var i@Inner(...)表示:匹配Inner类型的对象,同时将该对象绑定到变量i;var ii@InnerInner(var z)则把匹配到的InnerInner对象绑定到ii。无需嵌套switch,一行模式匹配就能同时获取所有需要的变量和嵌套对象引用。

该特性依赖Java的switch模式匹配,此特性在Java 16中以预览形式推出,Java 17正式成为标准特性,需确保使用对应版本的Java环境。

内容的提问来源于stack exchange,提问作者simbo1905

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 06:22:38