Patern Matching
Nota: es necesario un JDK 21 o superior. Sino queréis o podéis instalar una versióm última del JDK podéis usar este enlace: link.
Una de las características ampliadas con Java 9 es el Patern Matching que nos permite eliminar algunos cast explícitos, esto ya ha sido aplicado en expresiones como condiciones. Uso en el switch:
// Antes
Object o = ...; // any object
String formatted = null;
if (o instanceof Integer i) {
formatted = String.format("int %d", i);
} else if (o instanceof Long l) {
formatted = String.format("long %d", l);
} else if (o instanceof Double d) {
formatted = String.format("double %f", d);
} else {
formatted = String.format("Object %s", o.toString());
}
// Despues
Object o = ...; // any object
String formatter = switch(o) {
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 Object o2 -> String.format("Object %s", o.toString());
};
Uso del patern matching con instance of: Versión clásica del equals:
public class Point {
private int x;
private int y;
public boolean equals(Object o) {
if (!(o instanceof Point)) {
return false;
}
Point point = (Point) o;
return x == point.x && y == point.y;
}
// constructor, hashCode method and accessors have been omitted
}
Posible forma con patern matching:
public boolean equals(Object o) {
return o instanceof Point point &&
x == point.x &&
y == point.y;
}
Ahora también se puede usar con records Antes:
record Point(int x, int y) {}
static void printSum(Object o) {
if (o instanceof Point p) {
int x = p.x();
int y = p.y();
System.out.println(x + y);
}
}
Ahora:
void printSum(Object o) {
if (o instanceof Point(int x, int y)) {
System.out.println(x + y);
}
}
Al escribir la expresión de pattern matching para un record permite al mismo tiempo desestructurar los elementos y extraerlos a variables. La expresión resultante para desestructurar los elementos es muy verbosa pero hace más simple el acceso posterior a las variables de record.