Upprepning är lärandets moder. Även om vi redan pratat om Javas switch- sökord tidigare, kommer vi idag att se över grunderna och gräva i lite ny information.

Java har två typer av switch- konstruktioner: switch-satsen och switch-uttrycket. Switch-uttrycket blev officiellt i Java 14, efter att ha funnits i två inofficiella "förhandsgransknings"-varianter i version 12 och 13.

Men låt oss börja från början. Låt oss komma ihåg hur en gammal bra switch såg ut före version 12:

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;
}

En switch-sats är en uppsättning konstruktioner som kommer att exekveras en efter en. Det låter dig inte returnera ett värde. Det största problemet med att använda en switch-sats är att du kan lägga till ett oändligt antal kasusuttryck , och denna förmåga missbrukas ofta av programmerare.

Java 12 såg tillägget av en experimentell funktion: en ny version av switch – inte en switch-sats, utan ett switch-uttryck – som kan ge ett värde, använda funktionell programmering internt och slå samman fallsatser som har ett gemensamt värde, vilket gör att bygga kompakt.

I Java 12 kan du skriva om metoden getProductTypeByName() enligt följande:

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

    };
}

Nu ser koden renare ut. Pilsyntaxen från funktionell programmering låter oss returnera värden utan nyckelordet break , och generellt sett kan resultatet av att utföra switchen nu sparas till en variabel eller returneras via nyckelordet return .

Om vi ​​inte bara behöver returnera ett resultat utan också ha flera rader kod, så skulle vår switch se ut så hä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;
}

I Java 13 var switch-uttrycket fortfarande en experimentell funktion. För att göra det tillgängligt, precis som i Java 12, måste du använda kommandot --enable-preview när du kompilerar och kör. Den huvudsakliga, och i princip enda, "innovationen" av switchen i Java 13 är nyckelordet yield , som ersatte break .

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;
}

Den största skillnaden mellan yield och break är att break returnerar exekveringskontroll från en case -sats, men yield returnerar resultatet av hela växlingen och fungerar som en intern retursats .

I Java 14 har instansen av operatorn ändrats och kan nu användas så här:

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

Istället för det lite fula gamla sättet där du inte bara var tvungen att kontrollera variabeln med hjälp av instanceof , utan även casta den till en specifik typ.

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

Dessa ändringar är en del av Amber-projektet, som syftar till att lägga till stöd för mönstermatchning till Java.

Tack vare ändringen i instansen av operatorn i version 14 och en tillägg i version 16, kom mönstermatchning trots allt till version 17. Det är sant, det finns bara som en förhandsvisning för närvarande. Du kan prova det med --enable-preview :

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

Generellt sett tillför varje ny version fler och fler intressanta funktioner i språket, vilket gör Java-utvecklingen ännu coolare.