在我的代码中,程序会根据用户输入的文本执行某些操作。我的代码如下:
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语句中不起作用,但是我可以使用类似的东西。
答案 0 :(得分:450)
您可以使用两个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语句。每个休息声明 终止封闭的switch语句。控制流程继续 切换块后面的第一个语句。休息声明 是必要的,因为没有它们,switch块
fall through
中的语句:在匹配的case标签之后的所有语句都被执行 顺序,不管后续案例标签的表达, 直到遇到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
在交换机语句中使用字符串
在Java SE 7及更高版本中,您可以在交换机中使用String对象 陈述的表达。以下代码示例, 根据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。
答案 1 :(得分:36)
case text1:
case text4: {
//blah
break;
}
答案 2 :(得分:25)
case
值只是无代码“goto”点,可以共享相同的入口点:
case text1:
case text4:
//blah
break;
请注意,大括号是多余的。
答案 3 :(得分:19)
只做
case text1: case text4:
do stuff;
break;
答案 4 :(得分:6)
括号是不必要的。只是做
case text1:
case text4:
doSomethingHere();
break;
case text2:
doSomethingElse()
break;
如果有人好奇,这被称为案件突破。执行此操作的能力是结束案例陈述需要break;
的原因。有关详细信息,请参阅维基百科文章http://en.wikipedia.org/wiki/Switch_statement。
答案 5 :(得分:5)
其他人的fallthrough
答案很好。
然而,另一种方法是从case语句的内容中提取方法,然后从每种情况调用适当的方法。
在下面的示例中,案例'text1'和案例'text4'的行为相同:
switch (name) {
case text1: {
method1();
break;
}
case text2: {
method2();
break;
}
case text3: {
method3();
break;
}
case text4: {
method1();
break;
}
我个人认为这种写作案例陈述更具可维护性和可读性,特别是当您调用的方法具有良好的描述性名称时。
答案 6 :(得分:4)
通过接近是我感觉最好的方法。
case text1:
case text4: {
//Yada yada
break;
}
答案 7 :(得分:4)
通过在JDK-12早期访问版本中集成JEP 325: Switch Expressions (Preview),现在可以使用新形式的switch标签:-
case text1, text4 -> {
//blah
}
或改写one of the answers中的演示,例如:-
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);
}
}
这里是您可以尝试的方法-Compile a JDK12 preview feature with Maven
答案 8 :(得分:3)
案例值只是无代码“goto”点,可以共享相同的入口点:
案例text1:
案例text4:{
//做点什么 打破;
}
请注意,大括号是多余的。
答案 9 :(得分:3)
您可以使用:
case text1: case text4:
do stuff;
break;
答案 10 :(得分:1)
JEP 354: Switch Expressions (Preview)和JDK-14中的JEP 361: Switch Expressions (Standard)将扩展 switch语句 ,因此可以将其用作 表达式 。
现在您可以:
case L ->
):
“ case L->”开关标签右侧的代码仅限于表达式,块或(为方便起见)throw语句。
要从switch表达式中产生一个值,请删除带有值语句的
break
,而推荐使用yield
语句。
因此one of the answers的演示可能如下所示:
public class SwitchExpression {
public static void main(String[] args) {
int month = 9;
int year = 2018;
int numDays = switch (month) {
case 1, 3, 5, 7, 8, 10, 12 -> 31;
case 4, 6, 9, 11 -> 30;
case 2 -> {
if (java.time.Year.of(year).isLeap()) {
System.out.println("Wow! It's leap year!");
yield 29;
} else {
yield 28;
}
}
default -> {
System.out.println("Invalid month.");
yield 0;
}
};
System.out.println("Number of Days = " + numDays);
}
}
答案 11 :(得分:1)
另一种变体?
switch (name) {
case ['text1', 'text2']:
// do something
break
case 'text3':
// do something
break
default:
// do something
break
}
答案 12 :(得分:0)
29167 data one;
29168 set sashelp.class;
29169 run;
NOTE: There were 19 observations read from the data set SASHELP.CLASS.
NOTE: The data set WORK.ONE has 19 observations and 5 variables.
NOTE: DATA statement used (Total process time):
real time 0.01 seconds
cpu time 0.00 seconds
29170
29171 %stop_submission
ERROR: Execution canceled by an %ABORT CANCEL statement.
NOTE: The SAS System stopped processing due to receiving a CANCEL request.
您还可以通过switch case表达式分配一个值:
switch (name) {
case text1, text4 -> // do something ;
case text2, text3, text 5 -> // do something else ;
default -> // default case ;
}
它允许您通过开关大小写表达式返回一个值
String text = switch (name) {
case text1, text4 -> "hello" ;
case text2, text3, text5 -> "world" ;
default -> "goodbye";
};