Sisäkkäiset tietuekuviot
Sovita syvästi sisäkkäisiä tietoja.
Sisäkkäiset tietuekuviot on ilmainen Java Academy-oppitunti CoddyKitissä. Tämä on oppitunti 3/4. Voit lukea koko oppitunnin alta ilmaiseksi ja harjoitella sen jälkeen käytännössä selaimessa sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla. Oppitunti kuuluu Java Academy-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. Java Academy-kurssilla on yhteensä 4 oppituntia.
Sisäkkäiset record-kuviot
Record-kuviot voivat olla sisäkkäisiä: itsessään recordia oleva komponentti voidaan purkaa osiin ulomman kuvion sisällä. Näin syvästi rakenteinen data voidaan täsmäyttää yhdellä lausekkeella.
Sisäkkäinen tietomalli
Tarkastellaan Line-recordia, joka koostuu kahdesta Point-recordista. Sisemmät recordit sopivat luontevasti sisäkkäisiksi kuvioiksi.
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);
}
}Yhden tason purkaminen
Litistetty kuvio sitoo kaksi Point-komponenttia, mutta jättää ne kokonaisiksi.
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);
}
}
}Siirtyminen syvemmälle
Korvaa sisempi Point s omalla record-kuviollaan, jotta pääset suoraan koordinaatteihin: 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);
}
}
}Mikä tahansa syvyys
Sisäkkäisyys voi jatkua yhtä syvälle kuin dataasi tarvitaan. Jokaisella tasolla voit joko sitoa koko komponentin tai purkaa sitä lisää, jolloin kuvio vastaa rakenteen muotoa täsmällisesti.
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);
}
}
}varin ja tyyppien yhdistäminen
Sisäkkäisessä kuviossa voit yhdistää vapaasti eksplisiittisiä tyyppejä ja var-määreitä. Käytä var-määrettä komponenteille, jotka vain välität eteenpäin, ja eksplisiittisiä tyyppejä siellä, missä ne parantavat selkeyttä.
Sisäkkäiset kuviot switchissä
Sisäkkäiset kuviot ovat erityisen ilmaisuvoimaisia switchissä, koska kukin case-haara voi kuvata täsmällisen tietorakenteen muodon.
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))));
}
}Koko täsmäytyksen on onnistuttava
Sisäkkäinen kuvio täsmää vain, jos jokainen taso täsmää. Jos jokin komponentti on eri tyyppiä kuin sen alikuvio odottaa, koko täsmäytys epäonnistuu eikä muuttujia sidota.
Luettavuuden kompromissi
Syvä sisäkkäisyys on tehokasta, mutta koodia voi olla vaikea lukea. Jos kuviosta tulee liian suuri, pura yksi taso ja käsittele loput erillisellä logiikalla.
Guard-ehdot sisäkkäisille sidoksille
Koska sisäkkäiset kuviot tuovat sisäiset arvot paikallisiksi muuttujiksi, yksi when-ehto voi viitata usean tason kenttiin samanaikaisesti.
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))));
}
}Täydellinen esimerkki
Laske janan keskipiste purkamalla sen molemmat päätepisteet.
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))));
}
}Pikatarkistus
Testaa, miten hyvin ymmärrät sisäkkäiset record-kuviot.
Kertaus
Opit sisäkkäiset record-kuviot.
- Itsessään recordia oleva record-komponentti voidaan purkaa osiin suoraan kuviossa.
- Sisäkkäisyys voi jatkua mille tahansa syvyydelle, ja siinä voidaan yhdistää eksplisiittisiä tyyppejä ja
var-määreitä. - Täsmäytys onnistuu vain, jos jokainen taso täsmää.
- Sisäkkäisiä sidoksia voi käyttää sekä guard-ehdoissa että rungossa.
Opi Java tekoälytuutorin avulla — ilmaiseksi
Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.
- Kurssit
- 104
- Oppitunnit
- 374
Usein kysytyt kysymykset
Onko oppitunti ”Sisäkkäiset tietuekuviot” ilmainen?
Kyllä – oppitunnin ”Sisäkkäiset tietuekuviot” koko tekstin voi lukea täällä verkossa ilmaiseksi. Jos haluat harjoitella interaktiivisesti sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla sekä avata koko Java Academy-kurssin, päivitä CoddyKit PROhon. Java Academy-kurssilla on yhteensä 4 oppituntia.
Mitä opin oppitunnilla ”Sisäkkäiset tietuekuviot”?
Sovita syvästi sisäkkäisiä tietoja. Harjoittelet Java Academy-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.
Tarvitsenko kokemusta aloittaakseni Java Academy-opiskelun?
Aiempi kokemus ei ole tarpeen. CoddyKitin Java Academy-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 3/4.
Kuinka kauan ”Sisäkkäiset tietuekuviot”-oppitunnin suorittaminen kestää?
Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.
Voinko kirjoittaa ja suorittaa koodia tällä Java Academy-oppitunnilla?
Kyllä. Jokainen Java Academy-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.
Kaikki tämän kurssin oppitunnit
- Pattern Matching instanceof-lausekkeella
- Tietuekuviot
- Sisäkkäiset tietuekuviot
- Kuviot switch-lausekkeessa