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
...
Możliwość komentowania jest wyłączona.