Java 对一个switch case语句使用两个值
在我的代码中,程序根据用户输入的文本执行某些操作。我的代码如下所示:Java 对一个switch case语句使用两个值,java,switch-statement,Java,Switch Statement,在我的代码中,程序根据用户输入的文本执行某些操作。我的代码如下所示: switch (name) { case text1: { //blah break; } case text2: { //blah break; } case text3: { //blah break;
switch (name) {
case text1: {
//blah
break;
}
case text2: {
//blah
break;
}
case text3: {
//blah
break;
}
case text4: {
//blah
break;
}
但是,案例text1
和text4
中的代码是相同的。因此,我想知道我是否有可能实现类似的功能
case text1||text4: {
//blah
break;
}
我知道
|
运算符在case语句中不起作用,但是我可以使用类似的语句。您可以使用两个case
语句,如下所示
案例文本1:
案例文本4:{
//废话
打破
}
请参见此示例:代码示例计算特定月份的天数:
class SwitchDemo {
public static void main(String[] args) {
int month = 2;
int year = 2000;
int numDays = 0;
switch (month) {
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
numDays = 31;
break;
case 4:
case 6:
case 9:
case 11:
numDays = 30;
break;
case 2:
if (((year % 4 == 0) &&
!(year % 100 == 0))
|| (year % 400 == 0))
numDays = 29;
else
numDays = 28;
break;
default:
System.out.println("Invalid month.");
break;
}
System.out.println("Number of Days = "
+ numDays);
}
}
这是代码的输出:
天数=29天
漏洞:
另一个有趣的问题是break语句。每个中断语句
终止封闭的switch语句。控制流继续进行
开关块后面的第一条语句。中断语句
是必要的,因为没有它们,开关块中的语句会下降
通过
:在中执行匹配案例标签后的所有语句
序列,无论后续大小写标签的表达式如何,
直到遇到break语句
示例代码:
公共类切换直通{
公共静态void main(字符串[]args){
java.util.ArrayList futureMonths=
新的java.util.ArrayList();
整月=8;
开关(月){
案例1:未来月份。添加(“一月”);
案例2:未来月份。添加(“二月”);
案例3:未来月份。添加(“三月”);
案例4:未来月份。添加(“四月”);
案例5:未来月份。添加(“五月”);
案例6:未来月份。添加(“6月”);
案例7:未来月份。添加(“7月”);
案例8:未来月份。添加(“8月”);
案例9:未来月份。添加(“9月”);
案例10:未来月份。添加(“10月”);
案例11:未来数月。添加(“11月”);
案例12:未来月份。添加(“12月”);
默认:中断;
}
if(futureMonths.isEmpty()){
System.out.println(“无效月号”);
}否则{
用于(字符串月份名称:未来月份){
系统输出打印项次(月名);
}
}
}
}
这是代码的输出:
8月
九月
十月
十一月
十二月
在switch语句中使用字符串
在JavaSE7和更高版本中,可以在交换机中使用String对象
语句的表达式。下面的代码示例,
根据字符串的值显示月份数
命名月份:
公共类StringSwitchDemo{
公共静态整数getMonthNumber(字符串月份){
int monthNumber=0;
如果(月==null){
返回月号;
}
开关(month.toLowerCase()){
“1月”案:
月数=1;
打破
“二月”案:
月数=2;
打破
“三月”案:
月数=3;
打破
“四月”案:
月数=4;
打破
“可能”一案:
月数=5;
打破
“6月”案:
月数=6;
打破
“7月”案:
月数=7;
打破
“八月”案:
月数=8;
打破
“9月”案:
月数=9;
打破
“10月”案:
月数=10;
打破
“11月”案:
月数=11;
打破
“12月”一案:
月数=12;
打破
违约:
月数=0;
打破
}
返回月号;
}
公共静态void main(字符串[]args){
字符串month=“八月”;
整数返回的月数=
StringSwitchDemo.getMonthNumber(月);
if(returnedMonthNumber==0){
系统输出打印项次(“无效月份”);
}否则{
System.out.println(返回的月数);
}
}
}
此代码的输出为8
您可以这样做:
case text1:
case text4: {
//blah
break;
}
照办
case text1: case text4:
do stuff;
break;
case
值只是可以共享相同入口点的无代码“转到”点:
case text1:
case text4:
//blah
break;
请注意,支架是多余的。不需要支架。照办
case text1:
case text4:
doSomethingHere();
break;
case text2:
doSomethingElse()
break;
如果有人对此感到好奇,这被称为案例失误。这样做的能力是
中断的原因代码>是结束案例语句所必需的。更多信息,请参阅维基百科文章。其他人的错误答案都是好答案
然而,另一种方法是从case语句的内容中提取方法,然后从每个case中调用适当的方法
在下面的示例中,案例“text1”和案例“text4”的行为相同:
switch (name) {
case text1: {
method1();
break;
}
case text2: {
method2();
break;
}
case text3: {
method3();
break;
}
case text4: {
method1();
break;
}
我个人认为这种编写案例语句的风格更易于维护,可读性也更高,尤其是当你调用的方法有很好的描述性名称时。我觉得这种方法是最好的方法
case text1:
case text4: {
//Yada yada
break;
}
案例值只是可以共享相同入口点的无代码“转到”点:
case text1:
case text4:
//blah
break;
案例文本1:
案例文本4:{
//做点什么
中断;
}
请注意,大括号是多余的。随着JDK-12早期访问版本中的集成,现在可以使用交换机标签的新形式,如下所示:-
case text1, text4 -> {
//blah
}
或者重新表述演示,类似于:-
public class RephraseDemo {
public static void main(String[] args) {
int month = 9;
int year = 2018;
int numDays = 0;
switch (month) {
case 1, 3, 5, 7, 8, 10, 12 ->{
numDays = 31;
}
case 4, 6, 9, 11 ->{
numDays = 30;
}
case 2 ->{
if (((year % 4 == 0) &&
!(year % 100 == 0))
|| (year % 400 == 0))
numDays = 29;
else
numDays = 28;
}
default ->{
System.out.println("Invalid month.");
}
}
System.out.println("Number of Days = " + numDays);
}
}
以下是您可以尝试的方法-您可以使用:
case text1: case text4:
do stuff;
break;
在JDK-13和JDK-14中
String text = switch (name) {
case text1, text4 -> "hello" ;
case text2, text3, text5 -> "world" ;
default -> "goodbye";
};
String text = switch (name) {
case text1, text4 ->
yield "hello";
case text2, text3, text5 ->
yield "world";
default ->
yield "goodbye";
};