Java Academy · leksjon

Nestede record-mønstre

Finn treff i dypt nestede data

Leksjon 3 av 413 trinn

Nestede record-mønstre er en gratis leksjon i Java Academy på CoddyKit. Dette er leksjon 3 av 4. Du kan lese hele leksjonen gratis nedenfor – og deretter øve praktisk i nettleseren med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Den er en del av læringsløpet i Java Academy, og fremdriften din synkroniseres mellom nettet og CoddyKit-appen. Kurset i Java Academy inneholder totalt 4 leksjoner.

Nestede record-mønstre

Record-mønstre kan nestes: En komponent som selv er en record, kan destruktureres inne i det ytre mønsteret. Slik kan De matche dypt strukturerte data i ett uttrykk.

En nestet datamodell

Tenk på en Line som består av to Point-records. De indre record-ene er naturlige kandidater for nesting.

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

Destrukturering på ett nivå

Et flatt mønster binder de to Point-komponentene, men lar dem være hele.

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

Gå dypere

Bytt ut den indre Point s med sitt eget record-mønster for å komme direkte til koordinatene: 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);
        }
    }
}

Vilkårlig dybde

Nesting kan gå så dypt som dataene Deres krever. På hvert nivå kan De enten binde en hel komponent eller destrukturere den videre, slik at strukturen gjenspeiles nøyaktig.

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

Blande var og typer

Inne i et nestet mønster kan De fritt blande eksplisitte typer og var. Bruk var for komponenter De bare sender videre, og eksplisitte typer der det gir bedre tydelighet.

Nesting i switch

Nestede mønstre er særlig uttrykksfulle i switch, fordi hver case kan beskrive en presis datastruktur.

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

Hele matchen må lykkes

Et nestet mønster matcher bare hvis alle nivåer matcher. Hvis en komponent har en annen type enn undermønsteret forventer, mislykkes den samlede matchen, og ingen variabler bindes.

Avveining for lesbarhet

Dyp nesting er kraftig, men kan bli vanskelig å lese. Hvis et mønster blir for stort, bør De vurdere å destrukturere ett nivå og håndtere resten med separat logikk.

Guards over nestede bindinger

Fordi nestede mønstre eksponerer indre verdier som lokale variabler, kan én when-guard referere til felt fra flere nivåer samtidig.

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

Et komplett eksempel

Beregn midtpunktet på en linje ved å destrukturere begge endepunktene.

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

Kort kontroll

Test forståelsen av nestede record-mønstre.

Oppsummering

De har lært nestede record-mønstre.

  • En record-komponent som selv er en record, kan destruktureres direkte i mønsteret.
  • Nesting kan gå til enhver dybde og blande eksplisitte typer med var.
  • Matchen lykkes bare hvis alle nivåer matcher.
  • Indre bindinger kan brukes både i guards og i selve kroppen.
Gratis å komme i gang

Lær deg Java med en AI-veileder – gratis

Skriv og kjør ekte kode i nettleseren, få umiddelbar hjelp fra en AI-veileder som er tilgjengelig døgnet rundt, og fortsett der du slapp – på nettet eller i appen.

Kurs
104
Leksjoner
374

Ofte stilte spørsmål

Er leksjonen «Nestede record-mønstre» gratis?

Ja – hele teksten i «Nestede record-mønstre» er gratis å lese her på nettet. For å øve interaktivt med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt, og for å låse opp resten av Java Academy-kurset, kan du oppgradere til CoddyKit PRO. Kurset i Java Academy inneholder totalt 4 leksjoner.

Hva lærer jeg i «Nestede record-mønstre»?

Finn treff i dypt nestede data Du øver på Java Academy med praktisk kode som du kjører direkte i nettleseren, mens en AI-veileder som er tilgjengelig døgnet rundt, svarer på spørsmålene dine mens du jobber deg gjennom leksjonen.

Trenger jeg erfaring for å begynne med Java Academy?

Ingen tidligere erfaring er nødvendig. Java Academy på CoddyKit er lagt opp for både nybegynnere og viderekomne, så De kan begynne her eller helt fra start og lære i Deres eget tempo. Dette er leksjon 3 av 4.

Hvor lang tid tar leksjonen «Nestede record-mønstre»?

De fleste CoddyKit-leksjoner tar omtrent 5–10 minutter. Hver leksjon er kort og interaktiv, slik at De gjør jevne fremskritt og kan fortsette akkurat der De slapp – både på nettet og i appen.

Kan jeg skrive og kjøre kode i denne Java Academy-leksjonen?

Ja. Alle Java Academy-leksjoner har en innebygd kodeeditor, slik at De kan skrive og kjøre ekte kode direkte i nettleseren og få umiddelbar tilbakemelding fra AI – uten lokal konfigurering.

Alle leksjonene i dette kurset

  1. Mønstergjenkjenning for instanceof
  2. Record-mønstre
  3. Nestede record-mønstre
  4. Mønstre i switch
← Tilbake til Java Academy