2016-04-13 2 views
0

В Java этот синтаксис можно:Синтаксис Java: case switch как переменная?

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

Так что в этом случае я бы 5, потому что а = 1.

Есть подобный синтаксис для переключателя случае? Например, как это:

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

Так что я бы также 5, так как = 1?

ответ

0

К сожалению, этот синтаксис не поддерживается. Но вы могли бы имитировать такое поведение с 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); 

Конечно, вы можете подправить код, чтобы соответствовать вашим потребностям.

+0

Zoiks. Возможно, это решение немного на стороне тяжеловеса, чтобы избежать нескольких '=' операторов? –

+0

Всё зависит. Вы можете пойти гораздо дальше, близко к сопоставлению шаблонов Scala, тогда это станет действительно полезным. Я думаю, что «переключатель» «как есть» просто неудобен и опасен, и даже моя скромная импровизированная реализация позволяет избежать некоторых проблем (без «провалов», необходимо обработать случай по умолчанию). – Landei

+0

Предотвращение падения - возможно; Тем не менее, обработка случая по умолчанию легче выполняется определенным назначением. –

2

No.

только это возможно:

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

Нет, нет такого синтаксиса, но вы можете обернуть переключатель в метод и добиться подобного поведения:

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

... 
int i = switchMethod (1); 
0

В качестве альтернативного варианта вы можете использовать прицепные тройные данные:

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