public class PatternMatchingUtils {
    
    // Pattern matching with instanceof (Java 16+)
    public static String process(Object obj) {
        if (obj instanceof String str) {
            return "String: " + str.toUpperCase();
        } else if (obj instanceof Integer num) {
            return "Integer: " + (num * 2);
        } else if (obj instanceof Number num) {
            return "Number: " + num.doubleValue();
        }
        return "Unknown type";
    }
    
    // Pattern matching with guarded patterns
    public static String processWithGuard(Object obj) {
        if (obj instanceof String str && str.length() > 5) {
            return "Long string: " + str;
        } else if (obj instanceof String str) {
            return "Short string: " + str;
        }
        return "Not a string";
    }
    
    // Pattern matching in switch (Java 17+)
    public static String processWithSwitch(Object obj) {
        return switch (obj) {
            case String str -> "String: " + str;
            case Integer i -> "Integer: " + i;
            case Double d -> "Double: " + d;
            case null -> "Null value";
            default -> "Unknown: " + obj.getClass().getSimpleName();
        };
    }
    
    // Pattern matching with sealed classes
    public static double calculateArea(Shape shape) {
        return switch (shape) {
            case Circle c -> Math.PI * c.radius() * c.radius();
            case Rectangle r -> r.width() * r.height();
            case Triangle t -> 0.5 * t.base() * t.height();
        };
    }
    
    // Pattern matching with records
    public static String describe(Person person) {
        return switch (person) {
            case Person(String name, int age) when age < 18 -> name + " is a minor";
            case Person(String name, int age) when age >= 65 -> name + " is a senior";
            case Person(String name, int age) -> name + " is an adult";
        };
    }
}