instruction java-switch avec plage de int
Je veux utiliser une instruction switch pour vérifier une plage de nombres J'ai trouvé quelques endroits disant quelque chose comme
case 1...5
ou case (score >= 120) && (score <=125)
fonctionnerait mais je continue à obtenir des erreurs.
Ce que je veux, c'est que si le nombre est compris entre 1600 et 1699, faites quelque chose.
Je peux faire des instructions if mais j'ai pensé qu'il était temps de commencer à utiliser switch si possible.
4 answers
Au niveau de la JVM, l'instruction switch
est fondamentalement différente des instructions if.
Switch concerne les constantes de compilation qui doivent toutes être spécifiées au moment de la compilation, de sorte que le compilateur javac produit un bytecode efficace.
En Java, l'instruction switch
ne prend pas en charge les plages. Vous devez spécifier toutes les valeurs (vous pourriez profiter de tomber dans les cas) et default
case. Tout le reste doit être géré par des instructions if
.
Pour autant que je sache, les plages ne sont pas possibles pour les cas de commutation en Java. Vous pouvez faire quelque chose comme
switch (num) {
case 1: case 2: case 3:
//stuff
break;
case 4: case 5: case 6:
//more stuff
break;
default:
}
Mais à ce stade, vous pourriez aussi bien rester avec l'instruction if.
Vous pouvez utiliser l'opérateur ternaire, ? :
int num = (score >= 120) && (score <=125) ? 1 : -1;
num = (score >= 1600) && (score <=1699 ) ? 2 : num;
switch (num) {
case 1 :
break;
case 2 :
break;
default :
//for -1
}
Si vous voulez vraimentutiliser des instructions switch-voici un moyen de créer des pseudo-plages avec enum
s, de sorte que vous pouvez basculer sur les énumérations.
Tout d'abord, nous devrons créer les plages:
public enum Range {
TWO_HUNDRED(200, 299),
SIXTEEN_HUNDRED(1600, 1699),
OTHER(0, -1); // This range can never exist, but it is necessary
// in order to prevent a NullPointerException from
// being thrown while we switch
private final int minValue;
private final int maxValue;
private Range(int min, int max) {
this.minValue = min;
this.maxValue = max;
}
public static Range getFrom(int score) {
return Arrays.asList(Range.values()).stream()
.filter(t -> (score >= t.minValue && score <= t.maxValue))
.findAny()
.orElse(OTHER);
}
}
Puis votre commutateur:
int num = 1630;
switch (Range.getFrom(num)) {
case TWO_HUNDRED:
// Do something
break;
case SIXTEEN_HUNDRED:
// Do another thing
break;
case OTHER:
default:
// Do a whole different thing
break;
}