【问题标题】:Switches in Java: Can I include a condition in a case? [duplicate]Java 中的开关:我可以在案例中包含条件吗? [复制]
【发布时间】:2015-07-19 03:46:50
【问题描述】:

这是我的代码:

switch(age) {
    case 10:
        System.out.println("You are too young to drive.");
        break;
    case 20:
        System.out.println("You can drive!");
        break;
    default:
        System.out.println("Error");
}

如果年龄是 15 岁会怎样?好吧,它给了我一个错误。所以我想知道是否可以在案例中包含一个条件。例如,

case (age>=10 && age<=20):
   System.out.println("You're still too young to drive...");
   break;

我可以使用 if 语句,但我想知道这是否可以通过 switch 实现。

【问题讨论】:

  • 可以在 case 块中使用任何东西,但更合适的是使用 case 10: to case 19: 并将所有空白不中断,除了最后一个,声明 System.out.println("You're still too young to drive...");break; 终止,或者您可以简单地在switch 块内提供default: 标签,您可以在其中指定所需的消息:-)
  • 请注意,案例的结果是布尔值,所以除非年龄也是布尔值,否则这甚至没有意义。 Java 从每个案例创建一个常量跳转表,然后将开关与每个值进行比较,直到第一次匹配然后跳转到那里。这就是为什么 Java 在 case 表达式中需要 const 的原因。基本上可以在不执行(编译时)的情况下确定案例值吗?如果不能,请不要在案例中使用它。

标签: java


【解决方案1】:

case 需要常量表达式

没有。这是不可能的,因为case must be a constant expression。但是您可以(如您所料)使用if。从逻辑上讲,20(假设是法定年龄)以下的任何人都太年轻,不能开车。

final int drivingAge = 20;
if (age < drivingAge) {
    System.out.printf("%d is too young to drive...%n", age);
} else {
    System.out.printf("%d is old enough to drive.%n", age);
}

或者

这可以写成? : conditional operator(又名ternary expression注意有些人觉得三元很难阅读)就像

final int drivingAge = 20;
System.out.printf(age < drivingAge ? "%d is too young to drive...%n"
        : "%d is old enough to drive.%n", age);

【讨论】:

  • @Will: 对某人投反对票似乎很苛刻,因为 1) 风格偏好和 2) 附加而不是答案的核心部分。在许多情况下,最好缩小范围范围,以免引起非核心材料的负面关注。请注意,在这种情况下,条件表达式是 DRYer。
  • @Will 这是您的主观意见。我发现三元运算符可读,并且我认为短的 和富有表现力的 代码比冗长且不必要的冗长代码更好(这是我的主观意见)!
  • 无论如何,我已经删除了反对票,因为您添加了一条关于有些人觉得难以阅读的注释。不打算在这里争论。
【解决方案2】:

由于跌倒,您可以这样做:

switch(age){
    case 10:  
    case 11:
    case 12:
    case 13:
    case 14:
    case 15:
    case 16:
    case 17:
    case 18:
    case 19:
        System.out.println("You are too young to drive.");
        break;  
    case 20:
        System.out.println("You can drive!");
        break;
    default:
        System.out.println("Error");
}

代码有点多,但完成的事情是一样的。

【讨论】:

  • 我猜,OP 假设任何 20 岁以上或以上的人都可以开车。
  • 是的,你当然可以这样做,但是,那是低效的代码。
  • @Code123 不,它是用跳转表实现的,它是高效代码。但没有比 if 更有效(在 Java 中)(至少在通用基准测试中的 JITing 和预热之后)。
【解决方案3】:

不,在 Java 中你不能这样做。请改用if 语句。与您想要的结构类似的结构存在于其他语言中,例如 Scala

【讨论】:

    【解决方案4】:

    你不能在 Java 中做到这一点。一个开关跳转到与您正在打开的值匹配的case。您不能在case 中使用age 的表达式。但是,您可以使用称为“fallthrough”的东西(请参阅here 并搜索“fall through”)。

    因此,对于您的示例,您可以执行以下操作:

    switch(age)
    {
        case 10:
        case 11:
        case 12:
        case 13:
        case 14:
        case 15:
        case 16:
        case 17:
        case 18:
        case 19:
            System.out.println("You are too young to drive.");
            break;
    
        case 20:
        case 21:
            System.out.println("You can drive!");
            break;
    
        default:
            System.out.println("Error");
     }
    

    但是,您的问题最好通过if 来解决。

    【讨论】:

    • 是的,我知道这个选项,但它会浪费时间和低效的代码。 if 语句会容易得多。
    • 是的,这就是答案——使用if
    【解决方案5】:

    遗憾的是,这在 Java 中是不可能的。你将不得不求助于使用 if-else 语句。你可以试试这个,这是非常重复的。

      switch(age){ 
        case 10: case 11: case 12: case 13: case 14: case 15:
        //And So on
        System.out.println("You are too young to drive.");
            break;
        case 20:
            System.out.println("You can drive!");
            break;
        default:
            System.out.println("Error");
        }
    

    试试 if 语句

       public void canDrive(int age){
    
       if(age <= 19){
           System.out.println("You are too young to drive.")
       }
       else{
           System.out.println("You can drive!");}
       }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-03
      • 2015-12-15
      • 1970-01-01
      • 2011-10-04
      相关资源
      最近更新 更多