杰瑞科技汇

Java switch case如何匹配多个值?

  1. 多个 case 标签指向同一段代码:当多个不同的值需要执行相同的逻辑时。
  2. 在一个 case 中处理多个条件:这是在 Java 14 引入的模式匹配(Pattern Matching)之后才支持的特性。

下面我们分别对这两种情况进行详细说明。

Java switch case如何匹配多个值?-图1
(图片来源网络,侵删)

多个 case 标签指向同一段代码(最常见)

这是 switch 语句最经典和强大的用法之一,当你需要根据多个不同的输入值执行完全相同的操作时,可以将这些 case 标签写在一起,而不需要为每个 case 都重复写一遍代码块。

语法格式:

switch (expression) {
    case value1:
    case value2:
    case value3:
        // 当 expression 的值是 value1, value2, 或 value3 时,都会执行这里的代码
        // ...
        break;
    case value4:
        // ...
        break;
    default:
        // ...
}

工作原理: Java 会从上到下依次检查 expression 的值,如果匹配到任何一个 casevalue1),程序就会进入该 case 标签对应的代码块,然后继续向下执行,直到遇到 break 语句或 switch 语句的末尾。

示例代码:

Java switch case如何匹配多个值?-图2
(图片来源网络,侵删)

假设我们要根据星期几的数字(1-7)来输出“工作日”或“周末”,星期一(1)到星期五(5)都是工作日。

public class SwitchMultipleExample {
    public static void main(String[] args) {
        int dayOfWeek = 3; // 假设 3 代表星期三
        switch (dayOfWeek) {
            case 1: // 星期一
            case 2: // 星期二
            case 3: // 星期三
            case 4: // 星期四
            case 5: // 星期五
                System.out.println("今天是工作日。");
                break; // 必须有 break,否则会“贯穿”到下一个 case
            case 6: // 星期六
            case 7: // 星期日
                System.out.println("今天是周末!");
                break;
            default:
                System.out.println("输入的数字无效,请输入 1-7 之间的数字。");
                break;
        }
    }
}

输出:

今天是工作日。

关键点:

  • break 的重要性:如果没有 break,程序会发生“贯穿”(fall-through)现象,如果去掉 case 5break,当 dayOfWeek 为 5 时,它会打印“今天是工作日。”,然后继续执行 case 6 的代码,打印“今天是周末!”,这通常不是我们想要的结果。
  • default 分支:这是可选的,但它是一个很好的编程习惯,用于处理所有未明确列出的情况,防止意外行为。

在一个 case 中处理多个条件(Java 14+)

在传统的 switch 语句中,一个 case 只能匹配一个值,但从 Java 14 开始,引入了模式匹配(Pattern Matching)特性,使得 switch 语句变得更加强大和灵活,你可以在一个 case 标签中使用逗号 来指定多个条件,这些条件可以是值、类型,甚至是更复杂的模式。

Java switch case如何匹配多个值?-图3
(图片来源网络,侵删)

语法格式:

switch (expression) {
    case value1, value2, value3:
        // 当 expression 的值是 value1, value2, 或 value3 时,执行这里的代码
        // ...
        break;
    case type1 var1, type2 var2:
        // ...
        break;
    default:
        // ...
}

示例代码 1:匹配多个值

这个例子和上面的“工作日”例子功能相同,但写法更简洁。

public class SwitchMultipleCaseExample {
    public static void main(String[] args) {
        int dayOfWeek = 3;
        // 使用箭头语法 (->) 和多个 case 值 (Java 14+)
        switch (dayOfWeek) {
            case 1, 2, 3, 4, 5 -> System.out.println("今天是工作日。");
            case 6, 7 -> System.out.println("今天是周末!");
            default -> System.out.println("输入的数字无效,请输入 1-7 之间的数字。");
        }
    }
}

注意:这里使用了 ->(箭头)语法,这是 Java 14 引入的 switch 表达式的一部分,它更推荐使用,因为它可以避免 break 语句,并且整个 switch 可以返回一个值。

示例代码 2:类型模式匹配

这是更高级的用法。switch 可以根据表达式的类型来执行不同的逻辑。

public class SwitchTypePatternExample {
    public static void main(String[] args) {
        Object obj = "Hello, World!"; // 可以是 String, Integer, Double 等
        // 使用 switch 表达式和类型模式
        String result = switch (obj) {
            case String s -> "这是一个字符串,内容是: " + s;
            case Integer i -> "这是一个整数,值是: " + i;
            case Double d -> "这是一个双精度浮点数,值是: " + d;
            default -> "这是一个未知类型的对象。";
        };
        System.out.println(result);
    }
}

输出:

这是一个字符串,内容是: Hello, World!

关键点:

  • 版本要求:在一个 case 中处理多个条件(特别是类型模式)是 Java 14 及以上版本 的特性,如果你使用的是更早的版本,编译器会报错。
  • switch 表达式 vs switch 语句
    • switch 语句:以 switch (...) { ... } 的形式出现,以 break; 结束代码块。
    • switch 表达式:以 switch (...) { ... } 的形式出现,但每个 case 都必须产生一个值(通常使用 -> 语法),整个 switch 可以赋值给一个变量。
    • 对于新项目,强烈推荐使用 switch 表达式,因为它更安全、更简洁。

总结与对比

特性 传统 switch (Java 7 及以前) 增强型 switch (Java 14+)
多个值执行同一逻辑 通过将多个 case 标签连续书写,共享一个代码块。 可以在一个 case 标签中用逗号分隔多个值,case 1, 2, 3:
代码块结束 必须使用 break 语句来防止“贯穿”。 使用 -> 箭头语法的 switch 表达式不需要 break
类型匹配 不支持。 支持,可以在一个 case 中匹配多种类型,case String s, Integer i:
返回值 switch 语句本身不返回值。 switch 表达式可以返回一个值,可以直接赋给变量。
可空性 不支持 null,会抛出 NullPointerException 支持 case null: 来处理 null 值。

如何选择?

  • 如果你使用的是 Java 13 或更早版本:你必须使用情况一的方法,即把多个 case 标签写在一起,并确保在每个代码块末尾有 break
  • 如果你使用的是 Java 14 或更高版本:强烈推荐使用情况二switch 表达式,代码更清晰、更安全,也更不容易出错,它使得处理多个条件的逻辑变得非常直观。
分享:
扫描分享到社交APP
上一篇
下一篇