switch多值匹配

我们都知道 switch 用来走流程分支,大多情况下用来匹配单个值,如下面的例子所示:

/**
 * @from 微信公众号:Java技术栈
 * @author 栈长
 */
private static void test(int value) {
    switch (value) {
        case 1:
            System.out.println("1");
            break;
        case 2:
            System.out.println("1");
            break;
        case 3:
            System.out.println("1");
            break;
        case 4:
            System.out.println("1");
            break;
        case 5:
            System.out.println("1");
            break;
        case 6:
            System.out.println("0");
            break;
        case 7:
            System.out.println("0");
            break;
        default:
            System.out.println("-1");
    }
}

 

相关阅读:switch case 支持的 6 种数据类型

大概的意思就是,周一到周五输出:1,周六到周日输出:0,默认输出-1。

这样写,很多重复的逻辑,冗余了。

也许这个例子不是很合适,用 if/ else 更恰当,但这只是个例子,实际开发中肯定会有某几个 case 匹配同一段逻辑的情况。

那么,如何让多个 case 匹配同一段逻辑呢?

如下面例子所示:

/**
 * @from 微信公众号:Java技术栈
 * @author 栈长
 */
private static void test(int value) {
    switch (value) {
        case 1: case 2: case 3: case 4: case 5:
            System.out.println("1");
            break;
        case 6: case 7:
            System.out.println("0");
            break;
        default:
            System.out.println("-1");
    }
}

把相同逻辑的 case 放一起,最后一个 case 写逻辑就行了。

格式化后就是这样了:

/**
 * @from 微信公众号:Java技术栈
 * @author 栈长
 */
private static void test(int value) {
    switch (value) {
        case 1: 
        case 2: 
        case 3: 
        case 4: 
        case 5:
            System.out.println("1");
            break;
        case 6: 
        case 7:
            System.out.println("0");
            break;
        default:
            System.out.println("-1");
    }
}

是不是很骚?

其实这不是最合适的最好的写法,在 Java 12 中还可以更骚。

在 Java 12 中可以用逗号来分开多个值,还能用 lambda 表达式,甚至还能省略 break,使用 switch 更方便,那么在 Java 12 中可以怎样玩 switch?

先来定义一个枚举类:

public enum Status {
    OPEN, INIT, PROCESS, PENDING, CLOSE;
}

Java 12 之前是这样用的:

private static void testSwitch1(Status status) {
    int result = 0;
    switch (status) {
        case OPEN:
            result = 1;
            break;
        case PROCESS:
            result = 2;
            break;
        case PENDING:
            result = 2;
            break;
        case CLOSE:
            result = 3;
            break;
        default:
            throw new RuntimeException("状态不正确");
    }
    System.out.println("result is " + result);
}

Java 12 后可以这样用:

private static void testSwitch2(Status status) {
    var result = switch (status) {
        case OPEN -> 1;
        case PROCESS, PENDING -> 2;
        case CLOSE -> 3;
        default -> throw new RuntimeException("状态不正确");
    };
    System.out.println("result is " + result);
}

示例代码看了都懂吧,是不是很骚?

Java 12 switch 有以下几点特色:

  • 箭头语法 ->,类似 Java 8 中的 Lambda 表达式;

  • 可以直接返回值给一个变量,并且可以不用 break 关键字;

  • case 条件,多个可以写在一行,用逗号分开;

  • 可以省略 break 关键字;

当然你也可以使用 break 关键字,后面跟值:

当然你也可以使用 break 关键字,后面跟值:

private static void testSwitch3(Status status) {
    var result = switch (status) {
        case OPEN -> {
            break 1;
        }
        case PROCESS, PENDING -> {
            break 2;
        }
        case CLOSE -> {
            break 3;
        }
        default -> {
            break 5;
        }
    };
    System.out.println("result is " + result);
}

不推荐用这种,在编译器也会显示灰色,并提示你更改。

最后,这个新特性是 Java 12 预览版中的特性:JEP 325: Switch Expressions (Preview),要使用这个新特性,请切换至 Java 12 预览版。

参考 https://openjdk.java.net/jeps/325

好了,今天的分享就到这,收藏转发一下吧,多学习了解,日后必定有用!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值