【问题标题】:Java syntax: switch case as variable?Java语法:switch case作为变量?
【发布时间】:2016-04-13 09:23:17
【问题描述】:

在 java 中这种语法是可能的:

int a = 1;
int i = 0;
i = a == 1 ? 5 : 8;

所以在这种情况下,我将是 5,因为 a = 1。

switch case 有类似的语法吗? 比如这样:

int a = 1;
int i = 0;
i = switch (a) {
    case 1: 5; break;
    case 2: 8; break;
}

所以我也将是 5,因为 a = 1?

【问题讨论】:

    标签: java syntax switch-statement case


    【解决方案1】:

    没有。

    只有这样是可能的:

    switch (a) {
        case 1: i = 5; break;
        case 2: i = 8; break;
    }
    

    【讨论】:

      【解决方案2】:

      不,没有这样的语法,但是您可以将 switch 语句包装在一个方法中并实现类似的行为:

      public int switchMethod (int a)
      {
           switch (a) {
              case 1: return 5;
              case 2: return 8;
              default : return 0;
          }
      }
      
      ...
      int i = switchMethod (1);
      

      【讨论】:

        【解决方案3】:

        遗憾的是,不支持此语法。但是您可以使用 Java 8 模拟这种行为:

        import java.util.Optional;
        import java.util.function.Supplier;
        
        public class Switch {
        
            @SafeVarargs
            public static <T, U> Optional<U> of(T value, Case<T, U>... cases) {
                for (Case<T, U> c : cases) {
                    if (value.equals(c.getTestValue())) {
                        return Optional.of(c.getSupplier().get());
                    }
                }
                return Optional.empty();
            }
        
            public static <T, U> Case<T, U> when(T testValue, Supplier<U> supplier) {
                return new Case<T, U>() {
                    public T getTestValue() {
                        return testValue;
                    }
        
                    public Supplier<U> getSupplier() {
                        return supplier;
                    }
                };
            }
        
            public interface Case<T, U> {
                Supplier<U> getSupplier();
        
                T getTestValue();
            }
        }
        

        用法:

        String s = Switch.of(1,
                when(0, () -> "zero"),
                when(1, () -> "one"),
                when(2, () -> "two"))
                .orElse("not found");
        System.out.println(s);
        

        当然,您可以调整代码以满足您的需求。

        【讨论】:

        • 佐伊克斯。也许这个解决方案有点偏重于避免一些= 运营商?
        • 视情况而定。你可以走得更远,接近 Scala 的模式匹配,然后它就变得非常有用。我认为switch“原样”只是不方便和危险,甚至我适度的临时实现也避免了一些问题(没有“失败”,必须处理默认情况)。
        • 防止跌倒 - 也许;但是,通过明确的分配更容易执行默认情况的处理。
        • 再次,这取决于。 Optional 有几种处理缺失值的方法,或者您甚至可能更愿意“留在”Optional 以稍后处理问题。
        【解决方案4】:

        您也可以使用链式三元语句:

        int i = (a == 1) ? 5
              : (a == 2) ? 8
              : 0;
        

        【讨论】:

          猜你喜欢
          • 2016-03-25
          • 1970-01-01
          • 2013-05-15
          • 1970-01-01
          • 1970-01-01
          • 2020-06-19
          • 1970-01-01
          • 2017-09-06
          • 1970-01-01
          相关资源
          最近更新 更多