Java Academy · Oppitunti

Kuviot switch-lausekkeessa

Yhdistä suljetut tyypit ja kuviot.

Oppitunti 4/413 vaihetta

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 null käsittelee null-arvon turvallisesti.
Aloita maksutta

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

  1. Pattern Matching instanceof-lausekkeella
  2. Tietuekuviot
  3. Sisäkkäiset tietuekuviot
  4. Kuviot switch-lausekkeessa
← Takaisin: Java Academy