【java21】java21新特性之switch模式匹配

在Java18之前,模式匹配只能使用在if语句中,而在Java18及更高版本中,switch语句支持类型模式的匹配。这意味着开发者可以直接在case标签中匹配对象的类型,而无需在case语句内部进行显式的类型检查和转换。例如,可以直接匹配并处理Integer、String等类型的对象。

模式匹配

Java17中if语句中使用模式匹配:

package com.morris.java21;

/**
 * 模式匹配
 */
public class Switch17Demo {

    public static String formatter(Object o) {
        String formatted = "unknown";
        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 if (o instanceof String s) {
            formatted = String.format("String %s", s);
        }
        return formatted;
    }
}

switch模式匹配

在Java18中,可以通过switch模式对上面的代码进行改进:

package com.morris.java21;

/**
 * switch模式匹配
 */
public class Switch21Demo {

    public static String formatter(Object o) {
        return 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 String s -> String.format("String %s", s);
            default -> o.toString();
        };
    }
}

case中判断null

switch可以和null进行结合判断:

public static void testCaseNull(String s) {
    switch (s) {
        case null -> System.out.println("null");
        case "Morris", "Juan" -> System.out.println("MJ");
        default -> System.out.println("Ok");
    }
}

case中使用复杂表达式

case时可以加入复杂表达式:

static void testCaseExpression(Object o) {
    switch (o) {
        case String s when s.equalsIgnoreCase("YES") -> System.out.println("You got it");
        case String s when s.equalsIgnoreCase("NO") -> System.out.println("Shame");
        default -> System.out.println("Sorry?");
    }
}

switch中使用密封类

case时可以进行密封类类型判断:

static sealed interface S permits A, B, C {

}
static final class A implements S {

}
static final class B implements S {

}
static record C(int i) implements S {

}  // Implicitly final

public static int testSealed(S s) {
    return switch (s) {
        case A a -> 1;
        case B b -> 2;
        case C(int i) -> i;
    };
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

morris131

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值