JavaRush /Java Blog /Random-TK /Java-da jümläni üýtgediň

Java-da jümläni üýtgediň

Toparda çap edildi
Meşhur suratdaky gahryman ýaly çatrykda duranyňyzy göz öňüne getiriň. Çepe gitseň, atyňy ýitirersiň; sag tarapa gitseň bilim alarsyň. Şeýle ýagdaýy nädip meýilleşdirmeli? “If-then” we “ if -then-else” gurluşlaryny ulanyp, şeýle saýlawy edýändigimizi eýýäm bilýän bolsaňyz gerek .
if (turn_left) {
    System.out.println(«Коня потеряешь»);
}
if (turn_right) {
    System.out.println(“Знания обретёшь”);
}
else
    System.out.println(“Так и будешь стоять?);
Şeýle iki ýol bolmasa, 10 bolsa näme etmeli? 10 bölek mukdarda “sagda”, “biraz çepe”, “biraz çepe” we ş.m. ýol barmy? Bu wersiýada başga-başga koduňyzyň nähili ösjekdigini göz öňüne getiriň!
if (вариант1)
{}
else if (вариант2)
{}else if (вариантN).
Şeýlelik bilen, sizde bir çatryk ýok, ýöne birnäçe, 10 diýiň (bu ýerde möhüm zat, çatryklaryň sany çäklidir). Şeýle ýagdaýlar üçin ýörite saýlama operatory bar - “java switch” .
switch (ВыражениеДляВыбора) {
           case  (Значение1):
               Код1;
               break;
           case (Значение2):
               Код2;
               break;
...
           case (ЗначениеN):
               КодN;
               break;
           default:
               КодВыбораПоУмолчанию;
               break;
       }
Beýanatda ýerine ýetiriş tertibi aşakdaky ýaly:
  • SelectionExpression baha berilýär. Ondan soň, wyklýuçatel beýany netijäni indiki baha bilen deňeşdirýär (sanawda görkezilen tertipde).
  • “SelectExpression” bahasy bilen gabat gelýän bolsa, onda içegäniň yzyndaky kod ýerine ýetirilýär.
  • Arakesme konstruksiýasyna duş gelse , dolandyryş kommutator buýrugynyň daşynda geçirilýär.
  • “ExpressionForSelection” we “Values” arasynda gabat gelýän zat tapylmasa, dolandyryş “defaultSelectionCode” -e geçirilýär.
Möhüm nokatlar
  • Java-da wyklýuçatel saýlama beýany üçin “SelectionExpression” görnüşi aşakdakylardan biri bolmaly:

    • baýt , gysga , char , int .
    • Olaryň örtükleri Baýt , Gysga , Nyşan , Integer .
    • Setir (Java 7-den bäri).
    • Sanamak ( Enum ).
  • Bellenen blok islege bagly, eger SelectionExpression we Values ​​gabat gelmese, hiç hili çäre görülmez.
  • arakesme islege bagly däl, eger ýok bolsa, kod birinji wyklýuçatel breakduş gelýänçä ýa-da ahyryna çenli ýerine ýetirilmegini dowam etdirer.
  • birnäçe saýlama warianty üçin şol bir kody ýerine ýetirmek zerur bolsa, gaýtalanmazlyk üçin yzygiderli ýagdaý bloklarynda onuň öňünde birnäçe degişli bahalary görkezýäris .

Java-da wyklýuçatel beýanyny ulanmak praktikasyna geçeliň

Alada etme, biz teoriýa bilen gutardyk we indiki mysallardan soň hemme zat has düşnükli bolar. Geliň, başlalyň. Astronomiýadan Gün ulgamynyň planetalary hakda bir mysal göreliň. Iň soňky halkara düzgünlerine laýyklykda, Plutony (orbitasynyň aýratynlyklary sebäpli) aýyrarys. Planetalarymyzyň Günden aşakdaky yzygiderlilikde ýerleşýändigini ýadymyzdan çykaralyň: Merkuri, Wenera, Earther, Mars, upupiter, Saturn, Uran we Neptun. Geliň, planetanyň seriýa nomerini (Günden uzaklyga görä) kabul edýän we çykyş hökmünde bu planetanyň atmosferasynyň esasy düzümini Sanaw <String> görnüşinde öndürýän Java usulyny döredeliň . Käbir planetalaryň atmosfera düzüminiň meňzeşdigini ýatladýaryn. Şeýlelik bilen, Wenera we Mars esasan kömürturşy gazyny öz içine alýar, upupiter we Saturn wodoroddan we geliýden, Uran we Neptundan soňky jübüt gazdan başga-da metan bar. Biziň wezipämiz:
public static List<String> getPlanetAtmosphere(int seqNumberFromSun) {
    List<String> result = new ArrayList<>();
    switch (seqNumberFromSun) {
        case 1: result.add("No Atmosphere");
            break;
        case 2:
        case 4: result.add("Carbon dioxide");
            break;
        case 3: result.add("Carbon dioxide");
            result.add("Nitrogen");
            result.add("Oxygen");
            break;
        case 5:
        case 6: result.add("Hydrogen");
            result.add("Helium");
            break;
        case 7:
        case 8: result.add("Methane");
            result.add("Hydrogen");
            result.add("Helium");
            break;
        default:
            break;
    }
    return result;
}
Üns beriň: şol bir kody birmeňzeş atmosfera kompozisiýalary bilen planetalar bilen deňeşdirdik. Biz muny yzygiderli mysal konstruksiýalaryny ulanyp etdik . Şeýlelik bilen, öý planetamyzyň atmosferasynyň düzümini almak islesek, usulymyzy 3 parametr bilen atlandyrarys:
getPlanetAtmosphere(3).
System.out.println(getPlanetAtmosphere(3)) вернет нам [Углекислый газ, Азот, Кислород].
Arakesme bilen synag, breakhli arakesmeleri aýyrsak näme bolýar ? Iş ýüzünde synap göreliň:
public static List<String> getPlanetAtmosphere(int seqNumberFromSun) {
    List<String> result = new ArrayList<>();
    switch (seqNumberFromSun) {
        case 1: result.add("No Atmosphere");
        case 2:
        case 4: result.add("Carbon dioxide");
        case 3: result.add("Carbon dioxide");
            result.add("Nitrogen");
            result.add("Oxygen");
        case 5:
        case 6: result.add("Hydrogen");
            result.add("Helium");
        case 7:
        case 8: result.add("Methane");
            result.add("Hydrogen");
            result.add("Helium");
        default:
    }
    return result;
}
Usulyň netijesini çap etsek System.out.println(getPlanetAtmosphere(3)), öý planetamyz durmuş üçin beýle amatly bolmaz. Ora-da laýykmy? Özüňize baha beriň: [Uglerod dioksidi, azot, kislorod, wodorod, geliý, metan, wodorod, geliý], Näme üçin beýle boldy? Programma, ilkinji oýundan soň we wyklýuçatel blokynyň ahyryna çenli ähli ýagdaýlary ýerine ýetirdi.

Artykmaç optimizasiýa arakesmesi

Arakesme görkezmelerini we saýlama opsiýalaryny başga bir tertip bilen usuly ösdürip biljekdigimize üns beriň
public static List<String> getPlanetAtmosphere(int seqNumberFromSun) {
    List<String> result = new ArrayList<>();
    switch (seqNumberFromSun) {
        case 1: result.add("No Atmosphere");
                break;
        case 3: result.add("Nitrogen");
                result.add("Oxygen");
        case 2:
        case 4: result.add("Carbon dioxide");
                break;
        case 7:
        case 8: result.add("Methane");
        case 5:
        case 6: result.add("Hydrogen");
                result.add("Helium");
    }
     return result;
}
Has gysga görünýär, şeýlemi? Kazyýet tertibi bilen oýnamak we toparlara bölmek arkaly jümleleriň umumy sanyny azaltdyk. Indi gazyň her görnüşi sanawa diňe bir setir kod bilen goşulýar. Usulyň soňky mysalynyň sanawy diňe eseri görkezmek üçin görkezilýär, beýle stilde ýazmak maslahat berilmeýär . Şuňa meňzeş koduň awtory (we hatda üçünji tarap programmistleri) ony saklamaly bolsa, java kommutasiýa beýany üçin saýlama bloklary we ýerine ýetirip boljak kody döretmek logikasyny dikeltmek gaty kyn bolar.

Eger tapawutlar

If we wyklýuçatel jümleleri daşky görnüşde meňzeş bolsa-da , köp sanly operatoryň wyklýuçateliniň ýerine ýetiriş opsiýalaryny saýlamagyň aýratyn bahasyna esaslanýandygyny ýatdan çykarmaň. islendik logiki aňlatma bolup biler. Koduňyzy düzeniňizde bu hakykaty göz öňünde tutuň. Java-yň dürli wersiýalaryna geçmek üçin täzeliklere has içgin seredeliň.

Java 7-e geçiň

Java 7-den öň, wyklýuçateliň bahasy hökmünde baýt, gysga, char we int primitives ulanylyp bilner. Şeýle hem ýokarda sanalan başlangyç görnüşleriň sanlary we örtükleri üçin goldaw bardy: Nyşan, Baýt, Gysga we Integer. Oftenöne köplenç java wyklýuçatel setiriniň bahasyny tapmaly bolýarys! Java 6-da nähili boljakdygy:
DayOfWeek day = DayOfWeek.fromValue("Thursday");

switch (day) {
  case MONDAY:
     System.out.println("Today is windy !");
     break;
  case THURSDAY:
     System.out.println("Today is sunny !");
     break;
  case WEDNESDAY:
     System.out.println("Today is rainy!");
     break;
  default:
     System.out.println("Oooops, something wrong !");
Enum:
public enum DayOfWeek {
  MONDAY("Monday"),
  THURSDAY("Thursday"),
  WEDNESDAY("Wednesday"),
  NOT_FOUND("Not found");

  private final String value;

  DayOfWeek(final String value) {
     this.value = value;
  }

  public static DayOfWeek fromValue(String value) {
     for (final DayOfWeek dayOfWeek : values()) {
        if (dayOfWeek.value.equalsIgnoreCase(value)) {
           return dayOfWeek;
        }
     }
     return NOT_FOUND;
  }
}
Javaöne Java 7-den başlap, String görnüşini wyklýuçatel hökmünde baha hökmünde ulanmak mümkin boldy:
String day = "Thursday";

switch (day) {
  case "Monday":
     System.out.println("Today is windy !");
     break;
  case "Thursday":
     System.out.println("Today is sunny !");
     break;
  case "Wednesday":
     System.out.println("Today is rainy!");
     break;
  default:
     System.out.println("Oooops, something wrong !");
}
Täze aýratynlyklara garamazdan, enumy ulanmagyň usuly has çeýe we ulanmak üçin maslahat berilýär: bu enumy birnäçe gezek ulanyp bileris.

Java 12-e geçiň

Java 12 nagyş gabat gelmek üçin Switch aňlatmalaryny gowulandyrdy. Switchokardaky mysaldaky ýaly “Switch” -i ulanýan bolsak, käbir üýtgeýjiniň bahasyny kesgitlemek üçin bahany hasaplamaly we berlen üýtgeýjä bellemeli, soň bolsa arakesme ulanmaly bolduk:
int count = 2;
int value;
switch (count) {
  case 1:
     value = 12;
     break;
  case 2:
     value = 32;
     break;
  case 3:
     value = 52;
     break;
  default:
     value = 0;
}
Javaöne Java 12-iň mümkinçilikleri sebäpli bu aňlatmany aşakdaky ýaly täzeden ýazyp bileris:
int value = switch (count) {
  case 1:
     break 12;
  case 2:
     break 32;
  case 3:
     break 52;
  default:
     break 0;
};
Üýtgeşmelere azajyk geçeliň:
  1. Öňler blok bloklarynyň içinde üýtgeýän baha bellän bolsak, wyklýuçateliň beýanynyň özi hiç zady yzyna gaýtaryp bilmeýän bolsa, indi şeýle mümkinçiligimiz bar we bahany wyklýuçatel bilen gönüden-göni gaýtaryp berýäris.

  2. Ozal arakesme hukugymyzda indi hiç zat bolmazdy, indi bolsa wyklýuçatelimiziň bahasyny yzyna gaýtarmak üçin ulanýarys. Sütün bellikleri giriş nokadyny jümle blokyna belleýär. .Agny, şol nukdaýnazardan başga bir bellik gabat gelende-de aşakdaky ähli kodlaryň ýerine ýetirilmegi başlaýar.

    Netijede, bellikden bellige ahyrky geçiş, oňa “ýykylmak ” hem diýilýär .

Java-da jümläni üýtgetmek - 2Şeýle geçişi tamamlamak üçin ýa-da ähli elementlerden doly geçmeli, ýa-da arakesmeden ýa-da gaýdyp gelmeli. Java 12-de täzelik bize lambda operatoryny ulanmaga mümkinçilik berýär, bu bolsa öz gezeginde diňe sag tarapdaky koduň ýerine ýetirilmegini üpjün edýär. Hiç hili "şowsuzlyk" bolmazdan. Öňki mysal bu ýagdaýda nähili görüner:
int count = 2;
int value = switch (count) {
  case 1 -> 12;
  case 2 -> 32;
  case 3 -> 52;
  default -> 0;
};
Kod has ýönekeýleşdi, şeýlemi? Moreene bir zat: lambda operatory, içegäniň adaty meňzeşi bolup biler, şondan soň käbir amallar bilen bir blok bar:
int count = 2;
int value = switch (count) {
  case 1 -> {
     //some computational operations...
     break 12;
  }
  case 2 -> {
     //some computational operations...
     break 32;
  }
  case 3 -> {
     //some computational operations...
     break 52;
  }
  default -> {
     //some computational operations...
     break 0;
  }
};
Käbir ýagdaýlarda yzyna gaýtaryş gymmaty birmeňzeş bolsa näme etmeli? Görnüşinden, hakykatdanam käbir dürli gymmatlyklar üçin şol bir ýagdaý bar. Java 12-de täze aýratynlyklary ulanyp, muny nädip gysgaldyp bolar:
int count = 2;
int value = switch (count) {
  case 1, 3, 5 -> 12;
  case 2, 4, 6 -> 52;
  default -> 0;
};

Java 13-e geçiň

Java 13-de, wyklýuçateliň bahany yzyna gaýtarmak usuly üýtgedi. Java 12-de, arakesmeden soň yzyna gaýtaryş bahasyny ýazan bolsak, kommutator bloky üçin bize girdeji bolup hyzmat eden bolsa, indi hasyl sözüni ulanyp bahany yzyna gaýtaryp bereris . Geliň seredeliň:
int value = switch (count) {
  case 1:
     yield 12;
  case 2:
     yield 32;
  case 3:
     yield 52;
  default:
     yield 0;
};
Şol bir wagtyň özünde, java 12-de arakesme ulanyp ýazylan kod düzülmez (( Java-da jümläni üýtgetmek - 3Break ulanylar, ýöne hiç zady yzyna gaýtarmaly däl ýagdaýlarymyzda).

Jemi

  • Gurluşlar bilen koduňyzy bulaşdyrmazlyk üçin iki şahadan köp şahasy bar bolsa, kazyýet beýanyny ulanyň .
  • Her şahanyň logiki blokyny belli bir baha (kassanyň blokyna) arakesme jaňy bilen gutarmagy ýatdan çykarmaň .
  • Käbir başlangyç görnüşlerden başga-da, wyklýuçatel beýany Enum we String görnüşlerini aňlatma hökmünde hem ulanyp biler .
  • Bellenen bloky ýadyňyzdan çykarmaň - meýilleşdirilmedik saýlama bahalaryny dolandyrmak üçin ulanyň.
  • Öndürijiligi optimizirlemek üçin, iň köp saýlanylýan kod şahalaryny wyklýuçatel blokynyň başyna geçiriň.
  • Kazyýeti saýlamak blokynyň soňundaky arakesmäni aýyrmak bilen “optimizasiýa” almaň - beýle koda düşünmek kyn we netijede ösüş döwründe saklamak kyn.
Teswirler
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION