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
相关产品推荐
相关产品推荐

