对一个开关case语句使用两个值

在我的代码中,程序根据用户input的文本执行某些操作。 我的代码如下所示:

switch (name) { case text1: { //blah break; } case text2: { //blah break; } case text3: { //blah break; } case text4: { //blah break; } 

但是,案例text1text4的代码是相同的。 因此,我想知道是否可以实现类似的东西

 case text1||text4: { //blah break; } 

我知道|| 运算符将不会在case语句中工作,但有什么类似的我可以使用。

您可以使用两个CASE语句如下。

  case text1: case text4:{ //blah break; } 

看这个例子:代码示例计算特定月份的天数:

 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); } } 

这是代码的输出:

 Number of Days = 29 

通电路:

另一个有趣的地方是break语句。 每个break语句终止封闭的switch语句。 控制stream程继续执行开关块之后的第一条语句。 break语句是必需的,因为如果没有它们,switch语句块中的语句会fall through :匹配case标签之后的所有语句都会按顺序执行,而不pipe后续case标签的expression式如何,直到遇到break语句为止。

示例代码:

 public class SwitchFallThrough { public static void main(String[] args) { java.util.ArrayList<String> futureMonths = new java.util.ArrayList<String>(); int month = 8; switch (month) { case 1: futureMonths.add("January"); case 2: futureMonths.add("February"); case 3: futureMonths.add("March"); case 4: futureMonths.add("April"); case 5: futureMonths.add("May"); case 6: futureMonths.add("June"); case 7: futureMonths.add("July"); case 8: futureMonths.add("August"); case 9: futureMonths.add("September"); case 10: futureMonths.add("October"); case 11: futureMonths.add("November"); case 12: futureMonths.add("December"); default: break; } if (futureMonths.isEmpty()) { System.out.println("Invalid month number"); } else { for (String monthName : futureMonths) { System.out.println(monthName); } } } } 

这是代码的输出:

 August September October November December 

在开关语句中使用string

在Java SE 7和更高版本中,可以在switch语句的expression式中使用String对象。 以下代码示例根据名为month的string的值显示月份的编号:

 public class StringSwitchDemo { public static int getMonthNumber(String month) { int monthNumber = 0; if (month == null) { return monthNumber; } switch (month.toLowerCase()) { case "january": monthNumber = 1; break; case "february": monthNumber = 2; break; case "march": monthNumber = 3; break; case "april": monthNumber = 4; break; case "may": monthNumber = 5; break; case "june": monthNumber = 6; break; case "july": monthNumber = 7; break; case "august": monthNumber = 8; break; case "september": monthNumber = 9; break; case "october": monthNumber = 10; break; case "november": monthNumber = 11; break; case "december": monthNumber = 12; break; default: monthNumber = 0; break; } return monthNumber; } public static void main(String[] args) { String month = "August"; int returnedMonthNumber = StringSwitchDemo.getMonthNumber(month); if (returnedMonthNumber == 0) { System.out.println("Invalid month"); } else { System.out.println(returnedMonthNumber); } } } 

这个代码的输出是8。

从Java文档

你可以这样做:

 case text1: case text4: { //blah break; } 

case值只是可以共享相同入口点的无代码“goto”点:

 case text1: case text4: //blah break; 

请注意,大括号是多余的。

做就是了

 case text1: case text4: do stuff; break; 

别人的答案是好的。

然而,另一种方法是从您的case语句的内容中提取方法,然后从每个案例调用适当的方法。

在下面的例子中,'case1'和case'text4'的情况都是一样的:

 switch (name) { case text1: { method1(); break; } case text2: { method2(); break; } case text3: { method3(); break; } case text4: { method1(); break; } 

我个人发现这种写作风格的陈述风格更易于维护,可读性更强,特别是当您调用的方法具有很好的描述性名称时。

括号是不必要的。 做就是了

 case text1: case text4: doSomethingHere(); break; case text2: doSomethingElse() break; 

如果有人好奇,这就是所谓的案例贯彻。 做到这一点的能力是break;的原因break; 有必要结束案件陈述。 有关更多信息,请参阅wikipedia文章http://en.wikipedia.org/wiki/Switch_statement

通过做法是我觉得最好的一个。

 case text1: case text4: { //Yada yada break; } 

案例值只是可以共享相同入口点的无代码“goto”点:

案例text1:
案例text4:{
//做一点事
打破;
}

请注意,大括号是多余的。

最简单的方法就是使用同样的方法。

  switch (name) { case text1: { method1(); break; } case text2: { method2(); break; } case text3: { method3(); break; } case text4: { method1(); break; } } private void method1() { //do the logic which is same }