Indlejrede record patterns
Match dybt indlejrede data
Indlejrede record patterns er en gratis Java Academy-lektion på CoddyKit. Dette er lektion 3 af 4. Du kan læse hele lektionen gratis nedenfor — og derefter øve dig praktisk i browseren med en indbygget kodeeditor og en AI-vejleder, der er tilgængelig døgnet rundt. Den er en del af læringsforløbet i Java Academy, og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. Java Academy-kurset indeholder 4 lektioner i alt.
Indlejrede record-mønstre
Record-mønstre kan indlejres: En komponent, der selv er en record, kan destruktureres inde i det ydre mønster. Det gør det muligt at matche dybt strukturerede data i ét udtryk.
En indlejret datamodel
Forestil dig en Line, der består af to Point-records. De indre records er oplagte kandidater til indlejring.
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 i ét niveau
Et fladt mønster binder de to Point-komponenter, men lader 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å et niveau dybere
Erstat den indre Point s med dens eget record-mønster for at nå koordinaterne direkte: 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);
}
}
}En vilkårlig dybde
Indlejring kan gå lige så dybt som dine data. På hvert niveau bindes enten en hel komponent, eller også destruktureres den yderligere, så den nøjagtigt afspejler strukturens form.
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);
}
}
}Blanding af var og typer
I et indlejret mønster kan du frit blande eksplicitte typer og var. Brug var til komponenter, du kun sender videre, og eksplicitte typer dér, hvor det øger tydeligheden.
Indlejring i switch
Indlejrede mønstre er særligt udtryksfulde i switch, hvor hver case kan beskrive en præcis 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 matchningen skal lykkes
Et indlejret mønster matcher kun, hvis hvert niveau matcher. Hvis en komponent har en anden type end den, undermønsteret forventer, mislykkes den samlede matchning, og ingen variable bindes.
Afvejning af læsbarhed
Dybt indlejrede mønstre er effektive, men kan blive svære at læse. Hvis et mønster bliver for stort, kan du overveje at destrukturere ét niveau og håndtere resten med separat logik.
Vagter over indlejrede bindinger
Da indlejrede mønstre eksponerer indre værdier som lokale variable, kan en enkelt when-vagt henvise til felter fra flere niveauer på én gang.
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 komplet eksempel
Beregn midtpunktet på en linje ved at destrukturere begge endepunkter.
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))));
}
}Hurtig kontrol
Test din forståelse af indlejrede record-mønstre.
Opsummering
Du har lært indlejrede record-mønstre.
- En record-komponent, der selv er en record, kan destruktureres direkte i mønsteret.
- Indlejring kan gå til enhver dybde og blande eksplicitte typer med
var. - Matchningen lykkes kun, hvis hvert niveau matcher.
- Indre bindinger kan bruges både i vagter og i brødteksten.
Lær Java med en AI-underviser — gratis
Skriv og kør rigtig kode i din browser, få øjeblikkelig hjælp fra en AI-underviser døgnet rundt, og fortsæt, hvor du slap, på web eller i appen.
- Kurser
- 104
- Lektioner
- 374
Ofte stillede spørgsmål
Er lektionen “Indlejrede record patterns” gratis?
Ja — hele teksten til “Indlejrede record patterns” kan læses gratis her på nettet. Hvis du vil øve dig interaktivt med en indbygget kodeeditor og en AI-vejleder døgnet rundt og få adgang til resten af Java Academy-kurset, skal du opgradere til CoddyKit PRO. Java Academy-kurset indeholder 4 lektioner i alt.
Hvad lærer jeg i “Indlejrede record patterns”?
Match dybt indlejrede data Du øver dig i Java Academy med praktisk kode, som du kører direkte i browseren, og en AI-vejleder døgnet rundt besvarer dine spørgsmål, mens du arbejder dig gennem lektionen.
Skal jeg have erfaring for at begynde på Java Academy?
Der kræves ingen tidligere erfaring. Java Academy på CoddyKit er tilrettelagt for både begyndere og øvede, så du kan starte her eller fra begyndelsen og lære i dit eget tempo. Dette er lektion 3 af 4.
Hvor lang tid tager lektionen “Indlejrede record patterns”?
De fleste CoddyKit-lektioner tager cirka 5–10 minutter. Hver lektion er kort og interaktiv, så du gør løbende fremskridt og kan fortsætte, hvor du slap – på både web og app.
Kan jeg skrive og køre kode i denne Java Academy-lektion?
Ja. Alle Java Academy-lektioner har en indbygget kodeeditor, så du kan skrive og køre rigtig kode direkte i din browser og få øjeblikkelig feedback fra AI – uden lokal opsætning.
Alle lektioner i dette kursus
- Pattern matching for instanceof
- Record patterns
- Indlejrede record patterns
- Patterns i switch