Tekrar, öğrenmenin anasıdır. Daha önce Java'nın switch anahtar sözcüğünden bahsetmiş olsak da , bugün temelleri gözden geçireceğiz ve bazı yeni bilgilere gireceğiz.

Java'nın iki tür switch yapısı vardır: switch ifadesi ve switch ifadesi. Anahtar ifadesi, 12 ve 13 sürümlerinde iki resmi olmayan "önizleme" varyantında var olan Java 14'te resmi hale geldi.

Ama baştan başlayalım. Sürüm 12'den önce eski güzel bir anahtarın nasıl göründüğünü hatırlayalım:


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

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

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

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

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

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

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

Bir switch ifadesi, birbiri ardına yürütülecek olan bir dizi yapıdır. Bir değer döndürmenize izin vermez. Bir switch deyimi kullanmanın ana sorunu, sonsuz sayıda vaka ifadesi ekleyebilmenizdir ve bu yetenek genellikle programcılar tarafından kötüye kullanılır.

Java 12, deneysel bir özelliğin eklendiğini gördü: bir değer sağlayabilen, dahili olarak işlevsel programlamayı kullanabilen ve ortak bir değere sahip vaka deyimlerini birleştirerek bir anahtar deyimi değil, bir anahtar ifadesi olan yeni bir switch sürümü. kompakt yapı.

Java 12'de getProductTypeByName() yöntemini şu şekilde yeniden yazabilirsiniz:


public String getProductTypeByName(String product) {
    return switch (product) {
        case "Apple", "Peach" -> "Fruit";
        case "Raspberry", "Cherry" -> "Berry";
        case "Tomato" -> "Vegetable";
        default -> "other";

    };
}

Şimdi kod daha temiz görünüyor. İşlevsel programlamanın ok sözdizimi, break anahtar sözcüğü olmadan değerler döndürmemize izin verir ve genel olarak, anahtarı çalıştırmanın sonucu artık bir değişkene kaydedilebilir veya dönüş anahtar sözcüğü aracılığıyla döndürülebilir.

Yalnızca bir sonuç döndürmemiz değil, aynı zamanda birden çok kod satırına sahip olmamız gerekiyorsa, anahtarımız şöyle görünür:


public String getProductTypeByName(String product) {
    var result = switch (product) {
        case "Apple", "Peach" -> {
            System.out.println("This is a Fruit");
            break "Fruit";
        }
        case "Raspberry", "Cherry" -> {
            System.out.println("This is a Berry");
            break "Berry";
        }
        case "Tomato" -> {
            System.out.println("This is a Vegetable");
            break "Vegetable";
        }
        default -> {
            break "other";
        }

    };
     return result;
}

Java 13'te, switch ifadesi hala deneysel bir özellikti. Java 12'de olduğu gibi kullanılabilir hale getirmek için, derlerken ve çalıştırırken --enable-preview komutunu kullanmanız gerekir . Java 13'teki anahtarın ana ve esasen tek "yeniliği" , break yerine geçen verim anahtar sözcüğüdür .


public String getProductTypeByName(String product) {
    var result = switch (product) {
        case "Apple", "Peach" -> {
            System.out.println("This is a Fruit");
            yield "Fruit";
        }
        case "Raspberry", "Cherry" -> {
            System.out.println("This is a Berry");
            yield "Berry";
        }
        case "Tomato" -> {
            System.out.println("This is a Vegetable");
            yield "Vegetables";
        }
        default -> {
            System.out.println("Other");
            yield "other";
        }

    };
    return result;
}

verim ve break arasındaki temel fark, break'in bir case ifadesinden yürütme kontrolünü döndürmesi , ancak bir iç dönüş ifadesi gibi hareket ederek tüm switch'in sonucunu döndürmesidir .

Java 14'te, instanceof operatörü değişti ve artık şu şekilde kullanılabilir:


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

Değişkeni yalnızca instanceof kullanarak kontrol etmekle kalmayıp aynı zamanda onu belirli bir türe çevirmeniz gereken biraz çirkin eski yol yerine .


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

Bu değişiklikler, Java'ya kalıp eşleştirme desteği eklemeyi amaçlayan Amber projesinin bir parçasıdır.

Sürüm 14'teki instanceof operatöründeki değişiklik ve sürüm 16'daki bir uzantı sayesinde , desen eşleştirme, sonuçta sürüm 17'ye ulaştı. Doğru, şimdilik yalnızca önizleme olarak var. --enable-preview ile deneyebilirsiniz :


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

Genel olarak, her yeni sürüm, dile giderek daha fazla ilginç özellik getirir ve bu da Java geliştirmeyi daha da havalı hale getirir.