How to pattern match nested records in Java 22

63 Views Asked by At

In the following:

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); // <- how to reference the Inner? 
            System.out.println(ii); // <- how to reference the InnerInner?
        }
    }
}

I would like to name the Inner and InnerInner objects I match against. It seems that I can use nested switch statements for this:

    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);
                        }
                    }
                }
            }
        }
    }

In Scala, I can use i@Inner and ii@InnerInner in my match, which would be something like:

case Outer(i@Inner(ii@InnerInner(var z), var y), var x)

Is there a more succinct way to write this sort of logic in modern Java?

0

There are 0 best solutions below