Java - 开关表达式

大家好,未来的Java程序员们!今天,我们将深入探讨Java 12中引入并在Java 14中增强的一个最令人兴奋的特性:开关表达式。作为你们友好的计算机科学老师,我将引导你们完成这次学习之旅,即使你之前从未编写过一行代码。所以,系好安全带,让我们开始吧!

Java - Switch Expressions

什么是开关表达式?

在我们深入了解开关表达式之前,先快速了解一下什么是开关语句。想象一下,你在一个冰淇淋店,根据你的口味选择,你会得到不同的配料。在编程中,开关语句本质上就是这样做的——它允许你根据不同的条件执行不同的代码。

现在,开关表达式采用这个概念并使其更加强大和简洁。它们允许我们将整个开关块视为一个可以返回值的表达式。这就像从普通的冰淇淋甜筒升级到豪华圣代!

旧方法:传统的开关语句

让我们从一个传统的开关语句开始,看看我们过去是如何做的:

String day = "MONDAY";
String typeOfDay;

switch (day) {
case "MONDAY":
case "TUESDAY":
case "WEDNESDAY":
case "THURSDAY":
case "FRIDAY":
typeOfDay = "工作日";
break;
case "SATURDAY":
case "SUNDAY":
typeOfDay = "周末";
break;
default:
typeOfDay = "无效的日子";
}

System.out.println(typeOfDay);

在这个例子中,我们正在确定一天是工作日还是周末。注意我们如何使用break语句来防止穿透,并且我们必须在开关块外部声明typeOfDay

新方法:开关表达式

现在,让我们看看如何使用开关表达式实现相同的结果:

String day = "MONDAY";
String typeOfDay = switch (day) {
case "MONDAY", "TUESDAY", "WEDNESDAY", "THURSDAY", "FRIDAY" -> "工作日";
case "SATURDAY", "SUNDAY" -> "周末";
default -> "无效的日子";
};

System.out.println(typeOfDay);

哇!看看这个有多清晰和简洁。我们合并了多个案例,移除了break语句,并将结果直接赋值给typeOfDay。这就像整理你的房间——突然间一切都变得整洁有序!

使用 "case L ->" 标签的开关表达式

箭头语法(->)是开关表达式的一个关键特性。它允许我们以简洁的方式指定案例标签及其相关操作。让我们看看另一个例子:

int dayNumber = 3;
String dayName = switch (dayNumber) {
case 1 -> "星期一";
case 2 -> "星期二";
case 3 -> "星期三";
case 4 -> "星期四";
case 5 -> "星期五";
case 6 -> "星期六";
case 7 -> "星期日";
default -> "无效的日期编号";
};

System.out.println("第 " + dayNumber + " 天是 " + dayName);

在这个例子中,我们将一天的数字转换为相应的名称。箭头语法使每个案例成为单行,易于阅读。它就像一个指向正确答案的指示牌!

使用 "case L:" 语句和 yield 语句的开关表达式

有时,你可能需要在开关表达式中返回不仅仅是简单的值。这时yield语句就派上用场了。它就像是在说:“我完成计算了,这是最终答案!”

让我们看看一个例子:

int month = 8;
String season = switch (month) {
case 12, 1, 2:
yield "冬季";
case 3, 4, 5:
yield "春季";
case 6, 7, 8:
yield "夏季";
case 9, 10, 11:
yield "秋季";
default: {
String message = "无效的月份: " + month;
System.out.println(message);
yield "未知";
}
};

System.out.println("月份 " + month + " 的季节是 " + season);

在这个例子中,我们正在根据月份确定季节。注意我们如何使用yield来返回值,尤其是在default案例中,我们进行了更多的处理。

高级用法:案例标签中的表达式

开关表达式的一个最酷的特性是你可以 在案例标签中使用表达式。这就像给你的开关语句赋予了一个超能力!以下是一个例子:

record Person(String name, int age) {}

Person person = new Person("Alice", 25);

String lifeStage = switch (person) {
case Person p when p.age() < 13 -> "儿童";
case Person p when p.age() >= 13 && p.age() < 20 -> "青少年";
case Person p when p.age() >= 20 && p.age() < 60 -> "成人";
case Person p when p.age() >= 60 -> "老年";
default -> "未知";
};

System.out.println(person.name() + " 是一个 " + lifeStage);

在这个例子中,我们使用一个record(Java的另一个很酷的特性)来表示一个人,然后使用带有复杂条件的开关表达式来确定他们的生活阶段。这就像在你的代码中有一个个人生活教练!

结论

开关表达式是Java中一个强大的工具,可以使你的代码更易读、更简洁、更少出错。它们就像从翻盖手机升级到智能手机——突然间,你可以用更少的努力做更多的事情!

记住,编程就是练习。所以,不要害怕尝试这些概念。尝试创建自己的开关表达式,玩转不同的场景,最重要的是,玩得开心!

在我们结束之前,以下是我们在本文中讨论的关键方法的总结表:

方法 描述
-> 用于简洁案例标签和操作的箭头语法
yield 从开关表达式中返回值的语句
case L when condition 案例标签中的模式匹配

编程愉快,愿你的开关总是清晰表达!

Credits: Image by storyset