switch expression

All lectures for UZ purposes
Daraja, Dars
Mavjud

Takrorlash - o'rganishning onasi. Biz oldin Java'da switch haqida aytgan edik, bugun asosiy narsalarni eslaymiz va biroz yangi ma'lumotlarni ko'rib chiqamiz.

Java'da 2 ta switch varianti bor — bu switch statement va switch expression. Switch expression Java'ga 14 versiyasida rasmiy ravishda kiritilgan, 12 va 13 versiyalarda esa 2 ta modifikatsiyaga ega edi.

Lekin avvaliga, eski yaxshi 12 versiyagacha bo'lgan switch qanday ko'rinishda ekanligini eslaylik:


public String getProductTypeByName(String product) {
    String productType = "";

    switch (product) {
        case "Apple":
            productType = "Meva";
            break;

        case "Peach":
            productType = "Meva";
            break;

        case "Raspberry":
            productType = "Berry";
            break;

        case "Cherry":
            productType = "Berry";
            break;

        case "Tomato":
            productType = "Sabzavot";
            break;

        default:
            productType = "boshqa";
            break;
    }
        
    return productType;
}

switch statement — bu bir ketma-ketlikda bajariladigan konstruktsiyalar to'plami bo'lib, bajarilish natijasini qaytarishga imkon bermaydi. switch statement dan foydalanishning asosiy muammosi shundaki, u cheksiz miqdorda case ifodalari qo'shishga imkon beradi va programmistlar bundan ko'pincha noto'g'ri foydalanishadi.

Java 12 da uni experiment sifatida qo'shishgan, va endi switch statement emas, switch expression - switch ning yangi versiyasi, bo'lib, bajarilish natijasini saqlashga, funksional yondashuvni ichida foydalanishga va case ifodalari ichida qiymatlarni guruhlashga imkon beradi, shu bilan uni ixcham qilishga imkon beradi.

Java 12 yordamida getProductTypeByName() metodini qayta yozish mumkin:


public String getProductTypeByName(String product) {
    return switch (product) {
        case "Apple", "Peach" -> "Meva";
        case "Raspberry", "Cherry" -> "Berry";
        case "Tomato" -> "Sabzavot";
        default -> "boshqa";

    };
}

Endi kod ko'proq tartibli ko'rinishda. Funksional dasturlashdagi arrow syntax ni qo'llash break kalit so'zidan foydalanmasdan qiymatlarni qaytarish imkoniyatini beradi, va umuman switch ning bajarilish natijasini endi o'zgaruvchida saqlash yoki return orqali qaytarish mumkin.

Natijani qaytarib, bir nechta kod qatorlariga ega bo'lish kerak bo'lgan holatlarda, switch quyidagicha ko'rinadi:


public String getProductTypeByName(String product) {
    var result = switch (product) {
        case "Apple", "Peach" -> {
            System.out.println("Bu meva");
            break "Meva";
        }
        case "Raspberry", "Cherry" -> {
            System.out.println("Bu berry");
            break "Berry";
        }
        case "Tomato" -> {
            System.out.println("Bu sabzavot");
            break "Sabzavot";
        }
        default -> {
            break "boshqa";
        }

    };
     return result;
}

Java 13 da switch expression hali ham experiment sifatida qolmoqda, va uni ishlatish uchun, Java 12 dagidek, --enable-preview komandasi kompilatsiya va ishlatish uchun qo'llanishi kerak. Java 13 da switch ning asosiy va umuman yagona yangiliklari - bu yield kalit so'zi, bu so'z breakni o'rnini egallagan.


public String getProductTypeByName(String product) {
    var result = switch (product) {
        case "Apple", "Peach" -> {
            System.out.println("Bu meva");
            yield "Meva";
        }
        case "Raspberry", "Cherry" -> {
            System.out.println("Bu berry");
            yield "Berry";
        }
        case "Tomato" -> {
            System.out.println("Bu sabzavot");
            yield "Sabzavot";
        }
        default -> {
            System.out.println("Boshqa");
            yield "boshqa";
        }

    };
    return result;
}

yieldning breakdan asosiy farqi shundaki, break case - buyrug'idan boshqaruvni qaytarishda yield butun switch dan natijani qaytaradi, ichki return rolini o'ynaydi.

Java 14 da instanceOf operatori o'zgartirildi, va endi uni quyidagicha ishlatish mumkin:


if(o instanceof String s) {
s.toLowerCase();
}

Eski va unchalik chiroyli bo'lmagan variant o'rniga, instanceOf ga tekshirishdan tashqari, o'zgaruvchini muhim turga o'tkazish kerak bo'lar edi.


if(s instanceof String) {
((String) s).toLowerCase();
}

Bu o'zgarishlar Amber loyihasining bir qismi bo'lib, uning maqsadi Java ga pattern matching qo'llab-quvvatlashini qo'shishdir.

14 versiyada instanceOf operatori o'zgarishi va 16 da kengaytirilishi tufayli, Pattern Matching 17 versiyada kiritilgan. Lekin hozircha faqat preview sifatida, va uni --enable-preview yordamida test qilish mumkin:


public String getObjectType(Object object) {
    return switch (object) {
        case Integer i -> "Integer";
        case Long l -> "Long";
        case String s -> "String";
        default -> object.toString();
    };
}

Umuman har bir yangi versiyada tilda kiritish uchun tobora ko'proq qiziqarli funksiyalar mavjud bo'lmoqda, bu esa Java ni yanada zo'r qiladi.

Izohlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION