Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在switch-case语句中使用方法_Java_If Statement_Methods_Switch Statement - Fatal编程技术网

Java 在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

我想知道在开关的情况下是否可以使用诸如“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 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;
    }
}