Java 在switch-case语句中使用方法
我想知道在开关的情况下是否可以使用诸如“contains()”之类的方法。我试图将以下if语句转换为switch case:Java 在switch-case语句中使用方法,java,if-statement,methods,switch-statement,Java,If Statement,Methods,Switch Statement,我想知道在开关的情况下是否可以使用诸如“contains()”之类的方法。我试图将以下if语句转换为switch case: String sentence; if(sentence.contains("abcd")){ // do command a } else if(sentence.contains("efgh")){ // do command b } else if(sentence.contains("ijkl")){ // do command c } else{ //do co
String sentence;
if(sentence.contains("abcd")){
// do command a
}
else if(sentence.contains("efgh")){
// do command b
}
else if(sentence.contains("ijkl")){
// do command c
}
else{
//do command d
}
非常感谢您的帮助。不,您不能。case语句只能比较被“switch”编辑的对象的值。事实上,java只是“最近”才开始支持字符串上的switch语句,因为它们是对象而不是原语。通常,switch语句只在原语上工作。据我所知,唯一的例外是字符串实际上,你可以将其更改为switch,但它有点不可读:
final String sentence;
int mask = sentence.contains("abcd") ? 1 : 0;
mask |= sentence.contains("efgh") ? 2 : 0;
mask |= sentence.contains("ijkl") ? 4 : 0;
switch (mask) {
case 1:
case 1 | 2:
case 1 | 4:
case 1 | 2 | 4:
// do command a
break;
case 2:
case 2 | 4:
// do command b
break;
case 4:
// do command c
break;
default:
// do command d
}
}
否,因为
case
常量必须为:
- 恒量表达式
- 或与
表达式相同类型的枚举数的名称开关
case
标签都有一个case
常量,它是常量表达式或枚举常量的名称
是的,假设您使用的是JDK 7或更高版本,那么您可以使用switch语句获得等效的代码位。与调用equals方法的if-then-else语句链相比,这通常生成更高效的字节码
但是请注意,这仅适用于contains方法,因为contains方法需要一个String对象,而String对象现在在switch语句中是有效的。您不能将其推广到处理任意类型的对象。不,您不能<如果
开关不能完全替代开关,则可以打开枚举,而枚举也不是原语。这似乎与OP的代码没有相同的行为,除非您对哪个模式匹配有先验知识。@而且OP对哪个模式匹配有先验知识;在他的例子中,他在编译时对模式进行硬编码,这句话显然是由运行时的某种形式的输入提供的。因此,我的答案片段准确地再现了OP代码的行为。它使用它来查找第一个匹配模式。如果事先知道匹配模式,则不需要使用If
或开关来查找它。非常感谢,它工作得非常好!但是你能解释一下这种方法是如何工作的吗?非常感谢。@Flissie它使用位掩码来确定找到了什么子字符串,所以如果设置了第一位-这意味着找到了abcd,但一旦其他子字符串也可以出现-您需要对任何可能的位使用多个case语句mask@Iłya Bursov你知道这会产生比OP代码更高或更低效率的字节码吗?我正在编写自己的程序,有一个类似的问题,需要两个不同的大型if…else if…else
语句,这增加了复杂性。这两条语句都检查完全相同的字符串(相对于我的代码,而不是OP的),只是使用不同的字符串条件(例如sentence1.contains(“astring”)
和sentence2.contains(“astring”)
)@ajent OPs代码在这种切换情况下效率都不高
String pattern;
String sentence;
if (sentence.contains(pattern))
{
switch (pattern)
{
case "abcd":
// do command a
break;
case "efgh":
// do command b
break;
case "ijkl":
// do command c
break;
default:
// do command d
break;
}
}