Kuviot switch-lausekkeessa
Yhdistä suljetut tyypit ja kuviot.
Kuviot switch-lausekkeessa on ilmainen Java Academy-oppitunti CoddyKitissä. Tämä on oppitunti 4/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.
Kuviot switchissä
Switch on kehittynyt vakioiden täsmäyttämisestä kuvioiden täsmäyttämiseen. Yhdessä suljettujen tyyppien ja recordien kanssa switch voi ohjata suoritusta tyypin perusteella, purkaa dataa ja taata kattavuuden.
Tyyppikuviot switchissä
Jokainen case-haara voi olla tyyppikuvio, joka sitoo kyseistä haaraa varten tyypitetyn muuttujan.
public class Main {
static String kind(Object o) {
return switch (o) {
case Integer i -> "int " + i;
case String s -> "string " + s;
default -> "other";
};
}
public static void main(String[] args) {
System.out.println(kind(42));
System.out.println(kind("hi"));
System.out.println(kind(3.14));
}
}Suljetut tyypit eivät tarvitse default-haaraa
Kun valitsin on suljettu tyyppi ja kaikki sallitut alityypit on käsitelty, switch on kattava ilman default-haaraa.
public class Main {
sealed interface Shape permits Circle, Square {}
record Circle(double r) implements Shape {}
record Square(double s) implements Shape {}
static double area(Shape shape) {
return switch (shape) {
case Circle c -> Math.PI * c.r() * c.r();
case Square sq -> sq.s() * sq.s();
};
}
public static void main(String[] args) {
System.out.printf("%.2f%n", area(new Square(3)));
}
}Record-kuviot case-haaroissa
Case-haarat voivat purkaa recordeja osiin ja tuoda niiden komponentit suoraan haaran rungon käyttöön.
public class Main {
sealed interface Shape permits Circle, Rectangle {}
record Circle(double r) implements Shape {}
record Rectangle(double w, double h) implements Shape {}
static double area(Shape shape) {
return switch (shape) {
case Circle(double r) -> Math.PI * r * r;
case Rectangle(double w, double h) -> w * h;
};
}
public static void main(String[] args) {
System.out.printf("%.2f%n", area(new Rectangle(2, 5)));
}
}when-ehdot
when-lauseke lisää case-haaraan totuusarvoisen guard-ehdon. Case-haara täsmää vain, jos kuvio sopii ja guard-ehto on tosi.
public class Main {
static String size(Object o) {
return switch (o) {
case Integer i when i < 0 -> "negative";
case Integer i when i == 0 -> "zero";
case Integer i -> "positive";
default -> "not an int";
};
}
public static void main(String[] args) {
System.out.println(size(-5));
System.out.println(size(0));
System.out.println(size(7));
}
}Järjestys on tärkeä guard-ehtojen kanssa
Guard-ehdolliset case-haarat käsitellään ylhäältä alaspäin. Täsmällisemmän guard-ehdollisen haaran on oltava ennen yleisempää ehdotonta haaraa, muuten yleinen haara käsittelisi myös sen.
null-arvon käsittely
Lisää case null null-valitsimen käsittelemiseksi. Muuten switch heittää poikkeuksen NullPointerException. Voit yhdistää sen myös muotoon case null, default.
public class Main {
static String label(String s) {
return switch (s) {
case null -> "missing";
case "yes" -> "affirmative";
default -> "other: " + s;
};
}
public static void main(String[] args) {
System.out.println(label(null));
System.out.println(label("yes"));
System.out.println(label("maybe"));
}
}Sisäkkäiset kuviot switchissä
Case-haaroissa voidaan käyttää sisäkkäisiä record-kuvioita syvien rakenteiden täsmäyttämiseen ja sisempien arvojen tarkistamiseen yhdessä paikassa.
public class Main {
record Point(int x, int y) {}
record Line(Point a, Point b) {}
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 a, Point b) -> "line";
default -> "other";
};
}
public static void main(String[] args) {
System.out.println(describe(new Line(new Point(1, 0), new Point(1, 5))));
System.out.println(describe(new Line(new Point(0, 0), new Point(2, 3))));
}
}Lauseet ja lausekkeet
Kuvioita käyttävä switch toimii sekä lausekkeena, joka tuottaa arvon ->- tai yield-syntaksilla, että lauseena. Kattavuussäännöt ovat voimassa, kun valitsin on suljettu.
Visitor-koodin korvaaminen
Suljetut tyypit ja kuvioita käyttävä switch korvaavat yhdessä monisanaiset visitor-kuviot ja instanceof-ketjut tiiviillä, kääntäjän tarkistamalla ohjauksella suljetun mallin yli.
Täydellinen tulkki
Lausekkeiden arvioija, joka käyttää suljettua mallia ja kuvioita käyttävää switch-rakennetta.
public class Main {
sealed interface Expr permits Num, Add, Mul {}
record Num(int value) implements Expr {}
record Add(Expr left, Expr right) implements Expr {}
record Mul(Expr left, Expr right) implements Expr {}
static int eval(Expr e) {
return switch (e) {
case Num(int v) -> v;
case Add(Expr l, Expr r) -> eval(l) + eval(r);
case Mul(Expr l, Expr r) -> eval(l) * eval(r);
};
}
public static void main(String[] args) {
Expr e = new Add(new Num(2), new Mul(new Num(3), new Num(4)));
System.out.println(eval(e));
}
}Pikatarkistus
Testaa, miten hyvin ymmärrät switchissä käytettäviä kuvioita.
Kertaus
Opit switchissä käytettävät kuviot.
- Case-haarat voivat olla tyyppikuvioita tai record-kuvioita, jotka purkavat dataa.
- Suljetut valitsintyypit takaavat kattavat switch-rakenteet ilman
default-haaraa. when-guard-ehdot tarkentavat case-haaroja, ja järjestyksellä on merkitystä.case nullkäsittelee null-arvon turvallisesti.
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 ”Kuviot switch-lausekkeessa” ilmainen?
Kyllä – oppitunnin ”Kuviot switch-lausekkeessa” 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 ”Kuviot switch-lausekkeessa”?
Yhdistä suljetut tyypit ja kuviot. 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 4/4.
Kuinka kauan ”Kuviot switch-lausekkeessa”-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