您当前的位置: 首页 > 

Charge8

暂无认证

  • 3浏览

    0关注

    430博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

JDK13 Switch表达式新特性

Charge8 发布时间:2022-05-01 15:39:41 ,浏览量:3

先定义一个枚举类,方便后面 Demo演示。

public enum StatusEnum {
	STATUS_1("状态1"),

	STATUS_2("状态2"),

	STATUS_3("状态3"),

	STATUS_4("状态4"),

	STATUS_5("状态5"),
	;

	private String message;
	StatusEnum(String message) {
		this.message = message;
	}
}
一、JDK12 以前的特性

JDK12(不包含)以前的 switch是的写法:

	private static void jdk12Pre() {
		StatusEnum statusEnum = StatusEnum.STATUS_2;

		switch (statusEnum) {
		case STATUS_1:
			System.out.println("1:" + statusEnum.name());
			break;
		case STATUS_2:
			System.out.println("2:" + statusEnum.name());
		case STATUS_3:
			System.out.println("3:" + statusEnum.name());
			break;
		case STATUS_4:
			System.out.println("4:" + statusEnum.name());
			break;
		default:
			System.out.println("other");
		}
	}

上面代码中多处出现 break 语句,显得代码比较冗余,同时如果某处漏写一段 break 语句,将导致程序一直向下穿透执行的逻辑错误,出现异常结果,同时这种写法比较繁琐,也容易出问题。

Java 12之前版本中,switch 表达式支持下面类型: byte、char、short、int、Byte、Character、Short、Integer、enum、String。

二、JDK12新特性

switch表达式新特性:

  • 可以使用 -> 操作符,默认会在后面自动添加 break。
  • switch表达式拥有返回值。
1、->箭头操作符

在JDK12中 switch可以这样写:

	private static void jdk12_1() {
		StatusEnum statusEnum = StatusEnum.STATUS_5;

		switch (statusEnum) {
		case STATUS_1 -> System.out.println("1:" + statusEnum.name());
		case STATUS_2, STATUS_3 -> {
			System.out.println("2:" + statusEnum.name());
			System.out.println("3:" + statusEnum.name());
		}
		case STATUS_4 -> {
			System.out.println("4:" + statusEnum.name());
		}
		default -> throw new RuntimeException("没有这个枚举值的处理, statusEnum=" + statusEnum.name());
		}
	}

可以看出 JDK12中 switch的代码更清晰,更简洁。

注意:

  • 新语法使用->操作符,如果有多条语句,需要用 {}括起来。
  • 不需要写 break语句,因为新语法只会执行匹配的语句,没有穿透效应。
2、switch拥有返回值

switch拥有返回值,我们可以返回一个简单的值。

	private static void jdk12_2() {
		StatusEnum statusEnum = StatusEnum.STATUS_3;

		int returnValue = switch(statusEnum) {
			case STATUS_1 -> 4;
			case STATUS_2, STATUS_3 -> 5;
			case STATUS_4 -> 6;
			default -> throw new RuntimeException("没有这个枚举值的处理, statusEnum=" + statusEnum.name());
		};
		System.out.println(returnValue);
	}
三、JDK13新特性

JDK13中对 switch进一步改进,利用关键字 yield 可以对多态语句中将值返回,相当于函数的 return。

使用箭头表达式,如果右边的语句是多条语句,则用{}括起来,然后对于返回值,则通过关键字yield进行返回。

	private static void jdk13() {
		StatusEnum statusEnum = StatusEnum.STATUS_4;

		String name = switch (statusEnum) {
		case STATUS_1 -> statusEnum.name();
		case STATUS_2, STATUS_3 -> {
			System.out.println("2:" + statusEnum.name());
			System.out.println("3:" + statusEnum.name());
			yield statusEnum.name() + statusEnum.ordinal();
		}
		case STATUS_4 -> {
			System.out.println("4:" + statusEnum.name());
			yield statusEnum.name() + statusEnum.ordinal();
		}
		default -> {
			throw new RuntimeException("没有这个枚举值的处理, statusEnum=" + statusEnum.name());
			// yield null;
		}
		}; // 注意赋值语句要以;结束

		System.out.println("name=" + name);

	}

注意:赋值语句要以 ;结束。

– 求知若饥,虚心若愚。

关注
打赏
1661954522
查看更多评论
立即登录/注册

微信扫码登录

0.0548s