0Pricing
Java Academy · Lekcja

Zagnieżdżone wzorce rekordów

Dopasowywanie głęboko zagnieżdżonych danych

Zagnieżdżone wzorce rekordów to bezpłatna lekcja Java Academy na CoddyKit. To lekcja 3 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej Java Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Java Academy zawiera 4 lekcji w sumie.

Zagnieżdżone wzorce rekordów

Wzorce rekordów można zagnieżdżać: składowa będąca rekordem może zostać zdestrukturyzowana we wzorcu zewnętrznym. Umożliwia to dopasowanie głęboko zagnieżdżonych danych w jednym wyrażeniu.

Zagnieżdżony model danych

Proszę rozważyć rekord Line złożony z dwóch rekordów Point. Rekordy wewnętrzne są naturalnymi kandydatami do zagnieżdżenia.

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

Destrukturyzacja jednopoziomowa

Płaski wzorzec przypisuje do zmiennych dwie składowe typu Point, ale pozostawia je w całości.

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

Sięganie głębiej

Proszę zastąpić wewnętrzne Point s własnym wzorcem rekordu, aby uzyskać bezpośredni dostęp do współrzędnych: 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);
        }
    }
}

Dowolna głębokość

Zagnieżdżanie może sięgać tak głęboko, jak wymaga tego struktura danych. Na każdym poziomie można przypisać do zmiennej całą składową albo przeprowadzić dalszą destrukturyzację, dokładnie odzwierciedlając kształt struktury.

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

Łączenie var i typów

W zagnieżdżonym wzorcu można swobodnie łączyć jawnie podane typy z var. Proszę używać var dla składowych przekazywanych dalej bez zmian, a jawnych typów tam, gdzie poprawiają czytelność.

Zagnieżdżanie w switch

Zagnieżdżone wzorce są szczególnie wyraziste w switch, ponieważ pozwalają każdej gałęzi case opisać precyzyjny kształt danych.

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

Całe dopasowanie musi się powieść

Zagnieżdżony wzorzec pasuje tylko wtedy, gdy pasuje każdy poziom. Jeśli dowolna składowa ma inny typ niż oczekiwany przez jej podwzorzec, całe dopasowanie kończy się niepowodzeniem i żadna zmienna nie zostaje powiązana.

Kompromis dotyczący czytelności

Głębokie zagnieżdżanie jest potężne, ale może utrudniać czytanie kodu. Jeśli wzorzec staje się zbyt duży, proszę rozważyć destrukturyzację jednego poziomu i obsłużenie reszty za pomocą osobnej logiki.

Warunki dla zagnieżdżonych powiązań

Ponieważ zagnieżdżone wzorce udostępniają wartości wewnętrzne jako zmienne lokalne, pojedynczy warunek when może odwoływać się jednocześnie do pól z kilku poziomów.

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

Kompletny przykład

Proszę obliczyć środek odcinka, przeprowadzając destrukturyzację obu jego końców.

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

Szybkie sprawdzenie

Proszę sprawdzić swoje rozumienie zagnieżdżonych wzorców rekordów.

Podsumowanie

Poznał(a) Pan/Pani zagnieżdżone wzorce rekordów.

  • Składową rekordu, która sama jest rekordem, można zdestrukturyzować bezpośrednio we wzorcu.
  • Zagnieżdżanie może mieć dowolną głębokość i łączyć jawne typy z var.
  • Dopasowanie kończy się powodzeniem tylko wtedy, gdy pasuje każdy poziom.
  • Wewnętrzne powiązania są dostępne zarówno w warunkach, jak i w treści gałęzi.

Często zadawane pytania

Czy lekcja „Zagnieżdżone wzorce rekordów” jest bezpłatna?

Tak — pełny tekst „Zagnieżdżone wzorce rekordów” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu Java Academy, przejdź na CoddyKit PRO. Kurs Java Academy zawiera 4 lekcji w sumie.

Co nauczysz się w „Zagnieżdżone wzorce rekordów”?

Dopasowywanie głęboko zagnieżdżonych danych Ćwiczysz Java Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.

Czy potrzebuję doświadczenia, aby zacząć Java Academy?

Nie wymagamy żadnego doświadczenia. Java Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 3 z 4.

Ile czasu zajmuje lekcja „Zagnieżdżone wzorce rekordów”?

Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.

Czy mogę pisać i uruchamiać kod w tej lekcji Java Academy?

Tak. Każda lekcja Java Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.

Wszystkie lekcje w tym kursie

  1. Dopasowanie wzorców dla instanceof
  2. Wzorce rekordów
  3. Zagnieżdżone wzorce rekordów
  4. Wzorce w switch
← Powrót do Java Academy