tgoop.com/Java_Iibrary/1411
Create:
Last Update:
Last Update:
JDK 21 сопоставление с шаблоном (pattern matching) для switch стало постоянной фичей, а не превью — согласно JEP 441
Теперь можно писать такой switch:
private String format(Number n) {
return switch (n) {
case Integer i -> String.format("int %d", i);
case Long l -> String.format("long %d", l);
case Double d -> String.format("double %f", d);
case null -> "null";
default -> String.format("%s %s", n.getClass().getSimpleName(), n);
};
}
Такой switch-выражение во время выполнения под капотом обрабатывается через объект, созданный с помощью класса
SwitchBootstraps
.Пример:
void main() throws Throwable {
print(123);
print(456L);
print(7.89);
print(null);
print(7.89F);
}
private void print(Number n) throws Throwable {
IO.println(format(n));
}
private String format(Number n) throws Throwable {
var lookup = MethodHandles.lookup();
var callsite = SwitchBootstraps.typeSwitch(
lookup,
"",
MethodType.methodType(int.class, Number.class, int.class),
Integer.class, Long.class, Double.class
);
var target = callsite.getTarget();
int result = (int) target.invokeExact(n, 0);
return switch (result) {
case 0 -> { Integer i = (Integer) n; yield String.format("int %d", i); }
case 1 -> { Long l = (Long) n; yield String.format("long %d", l); }
case 2 -> { Double d = (Double) n; yield String.format("double %f", d); }
case -1 -> "null";
default -> String.format("%s %s", n.getClass().getSimpleName(), n);
};
}
Результат выполнения:
int 123
long 456
double 7.890000
null
Float 7.89
🔥 — знал об этом
👍 — полезно