0Pricing
Java Academy · Lección

Patrones de records anidados

Encuentre coincidencias en datos profundamente anidados

Patrones de records anidados es una lección gratuita de Java Academy en CoddyKit. Esta es la lección 3 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de Java Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de Java Academy incluye 4 lecciones en total.

Patrones de record anidados

Los patrones de record pueden anidarse: un componente que también es un record puede desestructurarse dentro del patrón exterior. Esto permite hacer coincidir datos profundamente estructurados en una sola expresión.

Un modelo de datos anidado

Considere un Line compuesto por dos records Point. Los records internos son candidatos naturales para el anidamiento.

public class Main {
    record Point(int x, int y) {}
    record Line(Point start, Point end) {}

    public static void main(String[] args) {
        Line line = new Line(new Point(0, 0), new Point(3, 4));
        System.out.println(line);
    }
}

Desestructuración de un nivel

Un patrón plano vincula los dos componentes Point, pero los deja completos.

public class Main {
    record Point(int x, int y) {}
    record Line(Point start, Point end) {}

    public static void main(String[] args) {
        Object obj = new Line(new Point(0, 0), new Point(3, 4));
        if (obj instanceof Line(Point s, Point e)) {
            System.out.println(s + " -> " + e);
        }
    }
}

Un nivel más profundo

Sustituya el Point s interno por su propio patrón de record para acceder directamente a las coordenadas: Line(Point(int x1, int y1), Point(int x2, int y2)).

public class Main {
    record Point(int x, int y) {}
    record Line(Point start, Point end) {}

    public static void main(String[] args) {
        Object obj = new Line(new Point(0, 0), new Point(3, 4));
        if (obj instanceof Line(Point(int x1, int y1), Point(int x2, int y2))) {
            double len = Math.hypot(x2 - x1, y2 - y1);
            System.out.println("Length: " + len);
        }
    }
}

Cualquier profundidad

El anidamiento puede alcanzar la profundidad de sus datos. En cada nivel se vincula un componente completo o se continúa desestructurándolo, reflejando exactamente la forma de la estructura.

public class Main {
    record Point(int x, int y) {}
    record Line(Point start, Point end) {}
    record Drawing(Line first, String label) {}

    public static void main(String[] args) {
        Object obj = new Drawing(new Line(new Point(1, 2), new Point(3, 4)), "diag");
        if (obj instanceof Drawing(Line(Point(var ax, var ay), var end), var label)) {
            System.out.println(label + " starts at " + ax + "," + ay);
            System.out.println("ends near " + end);
        }
    }
}

Combinación de var y tipos

En un patrón anidado puede combinar libremente tipos explícitos y var. Use var para los componentes que solo vaya a pasar y tipos explícitos cuando aporten claridad.

Anidamiento en switch

Los patrones anidados son especialmente expresivos en switch, ya que permiten que cada case describa una forma de datos precisa.

public class Main {
    record Point(int x, int y) {}
    record Line(Point start, Point end) {}

    static String describe(Object o) {
        return switch (o) {
            case Line(Point(var x1, var y1), Point(var x2, var y2)) when x1 == x2 -> "vertical";
            case Line(Point p1, Point p2) -> "general line";
            default -> "not a line";
        };
    }

    public static void main(String[] args) {
        System.out.println(describe(new Line(new Point(2, 0), new Point(2, 9))));
        System.out.println(describe(new Line(new Point(0, 0), new Point(5, 5))));
    }
}

Toda la coincidencia debe cumplirse

Un patrón anidado solo coincide si cada nivel coincide. Si algún componente es de un tipo diferente del que espera su subpatrón, la coincidencia general falla y no se vincula ninguna variable.

El equilibrio con la legibilidad

El anidamiento profundo es potente, pero puede resultar difícil de leer. Si un patrón crece demasiado, considere desestructurar un nivel y gestionar el resto con lógica independiente.

Guardas sobre vinculaciones anidadas

Como los patrones anidados exponen los valores internos como variables locales, una sola guarda when puede hacer referencia a campos de varios niveles a la vez.

public class Main {
    record Point(int x, int y) {}
    record Line(Point start, Point end) {}

    static boolean isUnitStep(Object o) {
        return o instanceof Line(Point(int x1, int y1), Point(int x2, int y2))
            && x2 - x1 == 1 && y2 - y1 == 1;
    }

    public static void main(String[] args) {
        System.out.println(isUnitStep(new Line(new Point(0, 0), new Point(1, 1))));
        System.out.println(isUnitStep(new Line(new Point(0, 0), new Point(2, 2))));
    }
}

Un ejemplo completo

Calcule el punto medio de una línea desestructurando ambos extremos.

public class Main {
    record Point(int x, int y) {}
    record Line(Point start, Point end) {}

    static Point midpoint(Object o) {
        if (o instanceof Line(Point(int x1, int y1), Point(int x2, int y2))) {
            return new Point((x1 + x2) / 2, (y1 + y2) / 2);
        }
        return null;
    }

    public static void main(String[] args) {
        System.out.println(midpoint(new Line(new Point(0, 0), new Point(4, 6))));
    }
}

Comprobación rápida

Compruebe su comprensión de los patrones de record anidados.

Recapitulación

Ha aprendido los patrones de record anidados.

  • Un componente de record que también es un record puede desestructurarse en línea.
  • El anidamiento puede alcanzar cualquier profundidad y combinar tipos explícitos con var.
  • La coincidencia solo tiene éxito si coinciden todos los niveles.
  • Las vinculaciones internas se pueden usar tanto en las guardas como en el cuerpo.

Preguntas frecuentes

¿La lección «Patrones de records anidados» es gratis?

Sí — el texto completo de «Patrones de records anidados» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de Java Academy, actualiza a CoddyKit PRO. El curso de Java Academy incluye 4 lecciones en total.

¿Qué aprenderé en «Patrones de records anidados»?

Encuentre coincidencias en datos profundamente anidados Practicas Java Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.

¿Necesito experiencia previa para empezar Java Academy?

No se requiere experiencia previa. Java Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 3 de 4.

¿Cuánto tiempo toma la lección «Patrones de records anidados»?

La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.

¿Puedo escribir y ejecutar código en esta lección de Java Academy?

Sí. Cada lección de Java Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.

Todas las lecciones de este curso

  1. Pattern Matching para instanceof
  2. Patrones de records
  3. Patrones de records anidados
  4. Patrones en switch
← Volver a Java Academy