2016-04-13 6 views
0

In Java ist möglich:Java-Syntax: Groß-/Kleinschreibung als Variable? Diese Syntax

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

in diesem Fall also würde ich 5 sein, da a = 1.

Gibt es eine ähnliche Syntax für Schaltergehäuse? Zum Beispiel wie folgt aus:

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

So dass ich auch 5 weil a = 1 sein würde?

Antwort

0

Leider wird diese Syntax nicht unterstützt. Aber könnte man ein solches Verhalten mit Java 8 simulieren:

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(); 
    } 
} 

Verbrauch:

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

Natürlich können Sie den Code optimieren Sie Ihre Bedürfnisse anzupassen.

+0

Zoiks. Vielleicht ist diese Lösung etwas schwergewichtig, um ein paar '=' Operatoren zu vermeiden? –

+0

Kommt drauf an. Sie können viel weiter gehen, in der Nähe von Scalas Musterabgleich, dann wird es wirklich nützlich. Ich denke, 'switch'" wie es ist "ist nur unbequem und gefährlich, und selbst meine bescheidene behelfsmäßige Implementierung vermeidet einige der Probleme (kein" Durchfallen ", der Standardfall muss behandelt werden). – Landei

+0

Durchfall verhindern - vielleicht; Die Handhabung des Standardfalls wird jedoch leichter durch eine bestimmte Zuweisung erzwungen. –

2

Nr

Nur ist dies möglich:

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

Nein, es gibt keine solche Syntax, aber Sie können Ihre switch-Anweisung in einem Verfahren wickeln und ein ähnliches Verhalten erreichen:

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

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

Sie können alternativ verkettete ternäre Anweisungen verwenden:

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