JavaRush /Blog Java /Random-MS /Tukar kenyataan dalam Java

Tukar kenyataan dalam Java

Diterbitkan dalam kumpulan
Bayangkan anda sedang berdiri di persimpangan, seperti wira dari lukisan terkenal. Jika anda pergi ke kiri, anda akan kehilangan kuda anda, jika anda pergi ke kanan, anda akan mendapat pengetahuan. Bagaimana untuk memprogramkan keadaan sedemikian? Anda berkemungkinan besar sudah tahu bahawa kami membuat pilihan sedemikian menggunakan binaan if-then dan if-then-else .
if (turn_left) {
    System.out.println(«Коня потеряешь»);
}
if (turn_right) {
    System.out.println(“Знания обретёшь”);
}
else
    System.out.println(“Так и будешь стоять?);
Bagaimana jika tidak ada dua trek sedemikian, tetapi 10? Adakah terdapat laluan "ke kanan", "sedikit ke kiri", "sedikit lagi ke kiri" dan seterusnya, dalam jumlah 10 keping? Bayangkan bagaimana kod if-then-else anda akan berkembang dalam versi ini!
if (вариант1)
{}
else if (вариант2)
{}else if (вариантN).
Jadi, anda tidak mempunyai satu garpu syarat, tetapi beberapa, katakan, 10 (perkara penting di sini ialah bilangan garpu adalah terhad). Untuk situasi sedemikian, terdapat pengendali pemilihan khas - switch case java .
switch (ВыражениеДляВыбора) {
           case  (Значение1):
               Код1;
               break;
           case (Значение2):
               Код2;
               break;
...
           case (ЗначениеN):
               КодN;
               break;
           default:
               КодВыбораПоУмолчанию;
               break;
       }
Perintah pelaksanaan dalam pernyataan adalah seperti berikut:
  • SelectionExpression dinilai. Seterusnya, pernyataan suis membandingkan ungkapan yang terhasil dengan Nilai seterusnya (dalam susunan yang disenaraikan).
  • Jika SelectExpression sepadan dengan Nilai, maka kod yang mengikuti kolon akan dilaksanakan.
  • Jika binaan pecah ditemui , maka kawalan dipindahkan di luar arahan suis.
  • Jika tiada padanan antara ExpressionForSelection dan Values ​​ditemui, maka kawalan dipindahkan ke DefaultSelectionCode.
Perkara penting
  • Jenis SelectionExpression untuk pernyataan pemilihan suis dalam Java mestilah salah satu daripada yang berikut:

    • bait , pendek , char , int .
    • Pembalutnya ialah Byte , Short , Character , Integer .
    • String (sejak Java 7).
    • Penghitungan ( Enum ).
  • Blok lalai adalah pilihan, maka jika SelectionExpression dan Values ​​tidak sepadan, tiada tindakan akan dilakukan.
  • break adalah pilihan; jika ia tidak hadir, kod akan terus dilaksanakan (mengabaikan perbandingan lanjut nilai dalam blok kes) sehingga breakpernyataan suis pertama ditemui atau sehingga tamat.
  • jika perlu untuk melaksanakan kod yang sama untuk beberapa pilihan pemilihan, untuk mengelakkan pertindihan kami menunjukkan beberapa nilai yang sepadan di hadapannya dalam blok kes berturut-turut .

Mari kita beralih kepada amalan menggunakan pernyataan suis dalam Java

Jangan risau, kita sudah selesai dengan teorinya, dan selepas contoh lanjut semuanya akan menjadi lebih jelas. Jadi mari kita mulakan. Mari kita lihat contoh dari astronomi tentang planet-planet sistem suria. Selaras dengan peraturan antarabangsa terkini, kami akan mengecualikan Pluto (kerana sifat orbitnya). Mari kita ingat bahawa planet kita terletak dari Matahari dalam urutan berikut: Utarid, Zuhrah, Bumi, Marikh, Musytari, Zuhal, Uranus dan Neptun. Mari buat kaedah Java yang menerima sebagai input nombor siri planet (berbanding jarak dari Matahari), dan sebagai output menghasilkan komposisi utama atmosfera planet ini dalam bentuk List <String> . Biar saya ingatkan anda bahawa sesetengah planet mempunyai komposisi atmosfera yang serupa. Oleh itu, Zuhrah dan Marikh mengandungi terutamanya karbon dioksida, Musytari dan Zuhal terdiri daripada hidrogen dan helium, dan Uranus dan Neptun, sebagai tambahan kepada pasangan gas terakhir, juga mempunyai metana. Fungsi kami:
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;
}
Sila ambil perhatian: kami membandingkan kod yang sama dengan planet dengan komposisi atmosfera yang sama. Dan kami melakukan ini dengan menggunakan pembinaan kes berturut-turut . Jadi, jika kita ingin mendapatkan komposisi atmosfera planet asal kita, kita memanggil kaedah kita dengan parameter 3:
getPlanetAtmosphere(3).
System.out.println(getPlanetAtmosphere(3)) вернет нам [Углекислый газ, Азот, Кислород].
Eksperimen dengan pemecahan Apakah yang berlaku jika kita mengalih keluar semua penyataan pemecahan ? Mari cuba dalam amalan:
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;
}
Jika kita mencetak hasil kaedah tersebut System.out.println(getPlanetAtmosphere(3)), maka planet asal kita tidak akan begitu sesuai untuk kehidupan. Atau sesuai? Nilailah sendiri: [Karbon dioksida, Nitrogen, Oksigen, Hidrogen, Helium, Metana, Hidrogen, Helium], Mengapa ini berlaku? Program ini melaksanakan semua kes selepas perlawanan pertama dan sehingga akhir blok suis.

Rehat pengoptimuman yang berlebihan

Ambil perhatian bahawa kami boleh menambah baik kaedah dengan susunan arahan putus dan pilihan pemilihan yang berbeza
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;
}
Nampak lebih pendek, bukan? Kami mengurangkan jumlah penyata dengan bermain dengan susunan kes dan pengumpulan semula. Kini setiap jenis gas ditambahkan pada senarai hanya dalam satu baris kod. Penyenaraian contoh terakhir kaedah ditunjukkan hanya untuk menunjukkan kerja; sangat tidak disyorkan untuk menulis dalam gaya sedemikian. Jika pengarang (dan lebih-lebih lagi pengaturcara pihak ketiga) kod yang serupa perlu mengekalkannya, maka ia akan menjadi sangat sukar untuk memulihkan logik untuk pembentukan blok pemilihan dan kod boleh laku untuk pernyataan suis java.

Perbezaan daripada jika

Walaupun pernyataan if dan suis adalah serupa dalam rupa , jangan lupa bahawa suis operator pilihan berganda mengasaskan pilihan pilihan pelaksanaan pada NILAI KHUSUS, manakala dalam if. boleh menjadi sebarang ungkapan logik. Ambil kira fakta ini semasa mereka bentuk kod anda. Mari kita lihat dengan lebih dekat inovasi untuk suis dalam versi Java yang berbeza.

Tukar dalam Java 7

Sebelum Java 7, primitif bait, pendek, aksara dan int boleh digunakan sebagai nilai untuk suis. Terdapat juga sokongan untuk enum dan pembalut jenis primitif yang disenaraikan di atas: Aksara, Bait, Pendek dan Integer. Tetapi selalunya kita perlu mencari nilai rentetan suis java! Inilah rupanya dalam 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 !");
Dan 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;
  }
}
Tetapi bermula dengan Java 7, adalah mungkin untuk menggunakan jenis String sebagai nilai untuk suis:
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 !");
}
Walaupun terdapat ciri baharu, pendekatan menggunakan enum adalah lebih fleksibel dan disyorkan untuk digunakan: kita boleh menggunakan semula enum ini berkali-kali.

Tukar dalam Java 12

Java 12 telah menambah baik ungkapan Suis untuk padanan corak. Jika kami menggunakan Suis seperti dalam contoh di atas, untuk menetapkan nilai beberapa pembolehubah, kami perlu mengira nilai dan menetapkannya kepada pembolehubah yang diberikan, dan kemudian gunakan 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;
}
Tetapi terima kasih kepada keupayaan Java 12, kita boleh menulis semula ungkapan ini seperti berikut:
int value = switch (count) {
  case 1:
     break 12;
  case 2:
     break 32;
  case 3:
     break 52;
  default:
     break 0;
};
Mari kita lihat sedikit perubahan:
  1. Jika sebelum ini kami menetapkan nilai pembolehubah di dalam blok kes, kerana pernyataan suis itu sendiri tidak dapat mengembalikan apa-apa, kini kami mempunyai peluang sedemikian, dan kami terus mengembalikan nilai menggunakan suis.

  2. Sebelum ini, kami tidak lagi boleh mempunyai apa-apa di sebelah kanan rehat, tetapi kini kami menggunakannya sebagai penyataan pulangan untuk mengembalikan nilai suis kami. Tanda titik bertindih menandakan titik masuk ke dalam blok pernyataan. Iaitu, dari titik itu pelaksanaan semua kod di bawah bermula, walaupun apabila label lain ditemui.

    Hasilnya ialah peralihan hujung ke hujung dari tanda ke tanda, yang juga dipanggil jatuh -melalui.

Tukar pernyataan dalam Java - 2Untuk melengkapkan pas sedemikian, anda mesti melalui semua elemen sepenuhnya, atau gunakan break atau return. Inovasi dalam java 12 memberi kita keupayaan untuk menggunakan operator lambda, yang seterusnya memastikan bahawa hanya kod di sebelah kanannya akan dilaksanakan. Tanpa sebarang "kegagalan". Bagaimanakah contoh sebelumnya kelihatan dalam kes ini:
int count = 2;
int value = switch (count) {
  case 1 -> 12;
  case 2 -> 32;
  case 3 -> 52;
  default -> 0;
};
Kod telah menjadi lebih mudah, bukan? Dan satu lagi: pengendali lambda juga boleh berfungsi sebagai analog tipikal kolon, selepas itu terdapat keseluruhan blok dengan beberapa operasi:
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;
  }
};
Nah, bagaimana jika bagi sesetengah kes nilai pulangan adalah sama? Ternyata kita sebenarnya mempunyai kes yang sama untuk beberapa nilai yang berbeza. Begini cara ini boleh dipendekkan menggunakan ciri baharu dalam Java 12:
int count = 2;
int value = switch (count) {
  case 1, 3, 5 -> 12;
  case 2, 4, 6 -> 52;
  default -> 0;
};

Tukar dalam Java 13

Dalam Java 13, cara suis mengembalikan nilai telah berubah. Jika dalam java 12 kami menulis nilai pulangan selepas rehat, yang berfungsi sebagai pulangan untuk kami untuk blok suis, kini kami akan mengembalikan nilai menggunakan perkataan yield . Mari lihat:
int value = switch (count) {
  case 1:
     yield 12;
  case 2:
     yield 32;
  case 3:
     yield 52;
  default:
     yield 0;
};
Pada masa yang sama, kod yang ditulis dalam java 12 menggunakan break to return tidak akan dikompilasi (( Tukar kenyataan dalam Java - 3Break akan digunakan, tetapi dalam situasi di mana kita tidak perlu mengembalikan apa-apa.

Jumlah

  • Gunakan pernyataan kes apabila terdapat lebih daripada dua cawangan untuk mengelakkan kekacauan kod anda dengan struktur if.
  • Jangan lupa untuk menamatkan blok logik setiap cawangan yang sepadan dengan nilai tertentu (blok kes) dengan panggilan rehat .
  • Sebagai tambahan kepada beberapa jenis primitif, pernyataan suis juga boleh menggunakan jenis Enum dan String sebagai ungkapan .
  • Ingat blok lalai - gunakannya untuk mengendalikan nilai pemilihan yang tidak dirancang.
  • Untuk mengoptimumkan prestasi, alihkan cawangan kod dengan pilihan yang paling biasa ke permulaan blok suis.
  • Jangan terpengaruh dengan "pengoptimuman" dengan mengalih keluar pemisah pada penghujung blok pemilihan kes - kod sedemikian sukar difahami dan, akibatnya, sukar untuk dikekalkan semasa pembangunannya.
Komen
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION