Mamy pewne ułatwienie w standarcie języka, gdzie zaoszczędzimy kilka linijek kodu w przypadku gdy używamy wyrażenia “Switch Expressions” do mapowania jednej wartości w inną lub wykonania krótkiego kawałka kodu na wzór funkcji lambda. W takim przypadku użyteczna będzie nowa forma. Można zauważyć, że w nowych wersjach “Switch Expressions” jest wzorowane na językach funkcyjnych.

Jak widać na przykładach można zaoszczędzić kilka linijek tekstu
Przykłady:

Wykonanie kawałka kodu

int number = (int) (Math.random() * 10);

//
// Java 8
//
switch (number){

    default:
        System.out.println("Normal power: " + number);
        break;
    case 1:
    case 2:
    case 3:
        System.out.println("Low power: " + number);
        break;
    case 7:
        System.out.println("Super power: " + number);
        break;
    case 8:
    case 9:
        System.out.println("Extra power: " + number);
        break;
}

//
// Java 11+
//
switch (number){
    default -> System.out.println("Normal power: " + number);
    case 1, 2, 3 -> System.out.println("Low power: " + number);
    case 7 -> System.out.println("Super power: " + number);
    case 8, 9 -> System.out.println("Extra power: " + number);
}

Mapowanie wartości

    DayOfWeek dayOfWeek = of(1 + (int) (Math.random() * 6));
    int value;

    switch (dayOfWeek){
        default:
            value = 1;
            break;
        case MONDAY:
        case TUESDAY:
        case WEDNESDAY:
            value = 2;
            break;
        case SATURDAY:
            value = 5;
            break;
            case SUNDAY:
            value = 10;
            break;
    }
    System.out.println("value = " + value);

    //
    // Java 11+
    //
    int value2 = switch (dayOfWeek){
        default -> 1;
        case MONDAY, TUESDAY, WEDNESDAY -> 2;
        case SATURDAY -> 5;
        case SUNDAY -> 10;
    };

    System.out.println("value2 = " + value2);

Użycie jako argumentu funkcji

Jest pewne ułatwnie, że nie przypisywać wyniku do zmiennej, aby następnie użyć go jako parametr metody. Ale czy to będzie czytelniejszy kod, to już każdy sam stwierdzi.

        int value = (int) (Math.random() * 5);

        switch (value){
            default:
                System.out.println("Default value");
                break;
            case 2:
            case 3:
            case 4:
                System.out.println("Power value");
                break;
            case 5:
                System.out.println("Super power value");
                break;
        }

        //
        // Java 11+
        //
        System.out.println(
        switch (value){
            default -> "Default value";
            case 2, 3, 4 -> "Power value";
            case 5 -> "Super power value";
        });

Zwracanie wartości przy pomocy słowa kluczowego “yield”

Próbuje znaleść zastosowanie dla tej konstrukcji, bo jest w nowym Switch Expressions skrócona w formie lambda. Również wygenerowany bytecode jest bardzo podobny pod względem budowy. Nie widać zbytniej różnicy pomiędzy starym switch cache, a nowym z zastosowaniem wyrażenia “yield”.

    int value = (int) (Math.random() * 3);
    DayOfWeek day;

    switch (value){
        default:
            day = MONDAY;
            break;
        case 2:
        case 3:
            day = TUESDAY;
            break;
        case 5:
            day = WEDNESDAY;
            break;
    }
    System.out.println("day = " + day);

    //
    // Java 13+
    //
    day = switch (value){
        default:
            yield MONDAY;
        case 2, 3, 4:
            yield TUESDAY;
        case 5:
            yield WEDNESDAY;
    };

    System.out.println("day = " + day);

Można zauważyć że różnica w bytecode jest w miejscu przypisywania zmiennej, w starym kodzie częściej występuje memonik “ASTORE 2”.

...
   L1
    LINENUMBER 180 L1
    ILOAD 1
    TABLESWITCH
      2: L2
      3: L2
      4: L3
      5: L4
      default: L3
   L3
    LINENUMBER 182 L3
   FRAME APPEND [I]
    GETSTATIC java/time/DayOfWeek.MONDAY : Ljava/time/DayOfWeek;
    ASTORE 2
   L5
    LINENUMBER 183 L5
    GOTO L6
   L2
    LINENUMBER 186 L2
   FRAME SAME
    GETSTATIC java/time/DayOfWeek.TUESDAY : Ljava/time/DayOfWeek;
    ASTORE 2
   L7
    LINENUMBER 187 L7
    GOTO L6
   L4
    LINENUMBER 189 L4
   FRAME SAME
    GETSTATIC java/time/DayOfWeek.WEDNESDAY : Ljava/time/DayOfWeek;
    ASTORE 2
   L6

...

...
   L8
    LINENUMBER 197 L8
    ILOAD 1
    TABLESWITCH
      2: L9
      3: L9
      4: L9
      5: L10
      default: L11
   L11
    LINENUMBER 199 L11
   FRAME SAME
    GETSTATIC java/time/DayOfWeek.MONDAY : Ljava/time/DayOfWeek;
    GOTO L12
   L9
    LINENUMBER 201 L9
   FRAME SAME
    GETSTATIC java/time/DayOfWeek.TUESDAY : Ljava/time/DayOfWeek;
    GOTO L12
   L10
    LINENUMBER 203 L10
   FRAME SAME
    GETSTATIC java/time/DayOfWeek.WEDNESDAY : Ljava/time/DayOfWeek;
   L12
   FRAME SAME1 java/time/DayOfWeek
    ASTORE 2
   L13
...