JavaRush /Java блогу /Random-KY /Java тилиндеги билдирүүнү которуштуруу

Java тилиндеги билдирүүнү которуштуруу

Группада жарыяланган
Элестеткиле, сиз атактуу картинадагы баатырдай болуп, айрыда турасыз. Солго барсаң атын жоголот, оңго кетсең orм аласың. Мындай кырдаалды кантип программалоо керек? Эгер биз мындай тандоону if-then жана if-then-else конструкцияларынын жардамы менен жасай турганыбызды билесиз .
if (turn_left) {
    System.out.println(«Коня потеряешь»);
}
if (turn_right) {
    System.out.println(“Знания обретёшь”);
}
else
    System.out.println(“Так и будешь стоять?);
Андай эки эмес, 10 трек болсочу? 10 даана өлчөмүндө "оңго", "бир аз солго", "бир аз көбүрөөк солго" жана башка жол барбы? If-then-else codeуңуз бул versionда кантип өсөөрүн элестетип көрүңүз !
if (вариант1)
{}
else if (вариант2)
{}else if (вариантN).
Демек, сизде бир айры шарт жок, бирок бир нече, айталы, 10 (бул жерде маанилүү нерсе - айрылардын саны чектелген). Мындай жагдайлар үчүн атайын тандоо оператору бар - switch case java .
switch (ВыражениеДляВыбора) {
           case  (Значение1):
               Код1;
               break;
           case (Значение2):
               Код2;
               break;
...
           case (ЗначениеN):
               КодN;
               break;
           default:
               КодВыбораПоУмолчанию;
               break;
       }
Билдирүүдө аткаруу тартиби төмөнкүдөй:
  • SelectionExpression бааланат. Андан кийин, switch оператору натыйжадагы туюнтманы кийинки Мааниси менен салыштырат (тизмеге ылайык).
  • Эгерде SelectExpression Мааниге дал келсе, анда эки чекиттен кийинки code аткарылат.
  • Эгерде тыныгуу конструкциясы кездешсе , анда башкаруу коммутатор буйругунан тышкары өткөрүлүп берилет.
  • Эгерде ExpressionForSelection жана Values ​​ортосунда эч кандай дал келүү табылбаса, анда башкаруу DefaultSelectionCodeге өткөрүлөт.
Маанилүү пункттар
  • Java'да которгуч тандоо билдирүүсү үчүн SelectionExpression түрү төмөндөгүлөрдүн бири болушу керек:

    • byte , кыска , char , int .
    • Алардын орогучтары byte , кыска , символ , бүтүн сан .
    • Стринг (Java 7ден бери).
    • Эсептөө ( Enum ).
  • Демейки блок милдеттүү эмес, анда SelectionExpression жана Values ​​дал келбесе, эч кандай аракет аткарылbyte.
  • тыныгууbreak милдеттүү эмес; эгерде ал жок болсо, code биринчи которуштуруу оператору жолукканга чейин же аягына чейин аткарылышын улантат (кап блокторундагы маанилерди андан ары салыштырууга көңүл бурbyte) .
  • бир нече тандоо варианттары үчүн бир эле codeду аткаруу зарыл болсо, кайталанууга жол бербөө үчүн биз анын алдында бир нече тиешелүү маанилерди ырааттуу блоктордо көрсөтөбүз .

Келгиле, Java тorнде switch операторун колдонуу практикасына өтөбүз

Кабатыр болбоңуз, биз теорияны бүтүрдүк, кийинки мисалдардан кийин баары айкыныраак болот. Ошентип, баштайлы. Күн системасынын планеталары жөнүндө астрономиядан бир мисалды карап көрөлү. Акыркы эл аралык эрежелерге ылайык, биз Плутонду (анын орбитасынын касиеттеринен улам) чыгарабыз. Биздин планеталар Күндөн төмөнкү ырааттуулукта жайгашканын эстейли: Меркурий, Венера, Жер, Марс, Юпитер, Сатурн, Уран жана Нептун. Келгиле, Java ыкмасын түзөлү, ал киргизүү катары планетанын сериялык номерин (Күндөн алыстыкка карата) кабыл алат, ал эми чыгуу катары бул планетанын атмосферасынын негизги курамын Тизме <Стринг> түрүндө берет . Кээ бир планеталардын атмосфера курамы окшош экендигин эске сала кетейин. Ошентип, Венера менен Марста негизинен көмүр кычкыл газы бар, Юпитер менен Сатурн суутек менен гелийден турат, Уран менен Нептунда акыркы жуп газдардан тышкары метан да бар. Биздин функция:
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;
}
Көңүл буруңуз: биз бир эле codeду атмосфералык курамы окшош планеталарга салыштырдык. Жана биз муну ырааттуу конструкцияларды колдонуу менен жасадык . Ошентип, эгерде биз үй планетабыздын атмосферасынын курамын алгыбыз келсе, анда биз 3-параметр менен ыкмабызды атайбыз:
getPlanetAtmosphere(3).
System.out.println(getPlanetAtmosphere(3)) вернет нам [Углекислый газ, Азот, Кислород].
break менен эксперимент Бардык break операторлорун алып салсак эмне болот ? Келгиле, аны иш жүзүндө сынап көрөлү:
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;
}
Эгерде биз методдун натыйжасын басып чыгарсак System.out.println(getPlanetAtmosphere(3)), анда биздин үй планетабыз жашоого мынчалык ылайыктуу болбойт. Же ылайыктуубу? Өзүңүз карап көрүңүз: [Көмүр кычкыл газы, азот, кычкылтек, суутек, гелий, метан, водород, гелий], эмне үчүн мындай болду? Программа биринчи матчтан кийин жана коммутатор блогунун аягына чейин бардык иштерди аткарды.

Ашыкча оптималдаштыруу тыныгуусу

Эсиңизде болсун, биз ыкманы тыныгуу директивалары жана тандоо варианттарынын башка тартиби менен өркүндөтө алабыз
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;
}
Кыскараак көрүнөт, туурабы? Иш тартиби менен ойноп , кайра топтоо аркылуу биз билдирүүлөрдүн жалпы санын кыскарттык. Эми газдын ар бир түрү тизмеге codeдун бир гана сабында кошулат. Методдун акыркы үлгүсүнүн тизмеси ишти көрсөтүү үчүн гана көрсөтүлгөн, мындай стилде жазуу сунушталbyte . Окшош codeдун автору (жана андан да көп үчүнчү тараптын программисттери) аны сакташ керек болсо, анда тандоо блокторун түзүү логикасын жана java switch операторунун аткарылуучу codeун калыбына келтирүү абдан кыйын болот.

Эгерде айырмачылыктар

if жана switch операторлорунун тышкы окшоштугун эске алуу менен , көп тандоо оператору которгуч аткаруу параметрлерин тандоодо SPECIFIC VALUE негиздерин, ал эми if'де экенин унутпаңыз. ар кандай логикалык туюнтма болушу мүмкүн. Кодуңузду иштеп чыгууда бул фактыны эске алыңыз. Келгиле, Javaнын ар кандай versionларында которулуу үчүн инновацияларды кененирээк карап чыгалы.

Java 7де которуу

Java 7ге чейин которгуч үчүн маани катары byte, кыска, char жана int примитивдери колдонулушу мүмкүн. Ошондой эле жогоруда саналып өткөн примитивдик типтердин энум жана орогучтары колдоого алынган: Символ, Байт, Кыска жана Бүтүн. Бирок көп учурда биз java которуштуруу саптын маанисин табышыбыз керек! Бул Java 6да кандай болот:
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 !");
Жана энум:
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 7ден баштап, которуштуруу үчүн маани катары String түрүн колдонууга мүмкүн болду:
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 !");
}
Жаңы мүмкүнчүлүктөргө карабастан, enum колдонуу ыкмасы ийкемдүү жана колдонууга сунушталат: биз бул энумду көп жолу колдоно алабыз.

Java 12де которуу

Java 12 үлгү дал келүү үчүн Switch туюнтмаларын жакшыртты. Эгерде биз жогорудагы мисалдагыдай Switch колдонсок, кандайдыр бир өзгөрмөнүн маанисин коюу үчүн, биз маанини эсептеп, аны берилген өзгөрмөгө дайындашыбыз керек болчу, андан кийин break колдонушубуз керек болчу:
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 12 мүмкүнчүлүктөрүнүн аркасында биз бул туюнтманы төмөнкүдөй кайра жаза алабыз:
int value = switch (count) {
  case 1:
     break 12;
  case 2:
     break 32;
  case 3:
     break 52;
  default:
     break 0;
};
Келгиле, өзгөрүүлөрдү бир аз карап көрөлү:
  1. Мурда биз case блокторунун ичине өзгөрүлмө маани койгон болсок, switch операторунун өзү эч нерсе кайтара албагандыктан, азыр бизде мындай мүмкүнчүлүк бар жана биз switch аркылуу маанини түз кайтарабыз.

  2. Мурда биз тыныгуунун оң жагында эч нерсеге ээ боло албайбыз, бирок азыр биз аны алмаштыргычтын маанисин кайтаруу үчүн кайтаруу оператору катары колдонобуз. Кош чекиттер билдирүү блогуна кирүү чекитин белгилейт. Башкача айтканда, ошол учурдан баштап, башка энбелги пайда болгондо да, төмөндөгү бардык codeдун аткарылышы башталат.

    Натыйжада белгиден белгиге акырына чейин өтүү болуп саналат, аны fall -through деп да аташат.

Java тorнде которуу оператору - 2Мындай өтүүнү аяктоо үчүн сиз бардык элементтерден толугу менен өтүшүңүз керек, же break же кайтарууну колдонушуңуз керек. Java 12деги инновация бизге ламбда операторун колдонуу мүмкүнчүлүгүн берет, ал өз кезегинде анын оң жагындагы code гана аткарылышын камсыздайт. Эч кандай "ишсиздик" жок. Бул учурда мурунку мисал кандай болот:
int count = 2;
int value = switch (count) {
  case 1 -> 12;
  case 2 -> 32;
  case 3 -> 52;
  default -> 0;
};
Код алда канча жөнөкөй болуп калды, туурабы? Жана дагы бир нерсе: ламбда оператору ошондой эле жоон ичегинин типтүү аналогу катары кызмат кыла алат, андан кийин кээ бир операциялар менен бүтүндөй блок бар:
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;
  }
};
Ооба, эгерде кээ бир учурларда кайтаруу мааниси бирдей болсочу? Көрсө, бизде ар кандай баалуулуктар үчүн бирдей учурлар бар экен. Бул Java 12деги жаңы функцияларды колдонуу менен кантип кыскартса болот:
int count = 2;
int value = switch (count) {
  case 1, 3, 5 -> 12;
  case 2, 4, 6 -> 52;
  default -> 0;
};

Java 13 менен которуштуруу

Java 13'те которгучтун маанини кайтаруу жолу өзгөрдү. Эгерде java 12де биз которуштуруу блогу үчүн кайтарым катары кызмат кылган тыныгуудан кийин кайтаруу маанисин жазган болсок, эми биз yield сөзүн колдонуп маанини кайтарабыз . Кел карайбыз:
int value = switch (count) {
  case 1:
     yield 12;
  case 2:
     yield 32;
  case 3:
     yield 52;
  default:
     yield 0;
};
Ошол эле учурда кайтуу үчүн тыныгуу аркылуу java 12де жазылган code компиляцияланbyte (( Java тorнде которуу оператору - 3Break колдонулат, бирок эч нерсени кайтаруунун кереги жок болгон учурларда.

Бардыгы

  • Кодуңузду if структуралары менен чаташтырбоо үчүн экиден ашык бутак болгондо case операторун колдонуңуз .
  • Белгилүү бир мааниге туура келген ар бир бутактын логикалык блогун үзгүлтүккө учуратуу чакырыгы менен бүтүрүүнү унутпаңыз .
  • Кээ бир примитивдүү типтерден тышкары, switch оператору Enum жана String түрлөрүн туюнтма катары да колдоно алат .
  • Демейки блокту унутпаңыз - аны пландаштырылбаган тандоо маанилерин иштетүү үчүн колдонуңуз.
  • Ишти оптималдаштыруу үчүн, эң кеңири таралган тандоолор менен code бутактарын которгуч блогунун башына жылдырыңыз.
  • Ишти тандоо блогунун аягындагы тыныгууну алып салуу менен "оптималдаштыруу" менен алек болбоңуз - мындай codeду түшүнүү кыйын, натыйжада аны иштеп чыгуу учурунда сактоо кыйын.
Комментарийлер
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION