Java dans l'opérateur
-
29-10-2019 - |
Question
Pour un millionième fois, j'aurais aimé utiliser un IN
opérateur en java, similaire à IN
Opérateur en SQL. Il pourrait simplement être mis en œuvre en tant que sucre syntaxique du compilateur. Donc ça
if (value in (a, b, c)) {
}
else if (value in (d, e)) {
}
... serait vraiment génial. En fait, ce qui précède est le même que la construction plutôt verbeuse (et non adaptée aux primitives) ici:
if (Arrays.asList(a, b, c).contains(value)) {
}
else if (Arrays.asList(d, e).contains(value)) {
}
Ou comme ça pour int
, long
et des types similaires:
switch (value) {
case a:
case b:
case c:
// ..
break;
case d:
case e:
// ..
break;
}
Ou peut-être qu'il pourrait y avoir des implémentations encore plus efficaces.
Question:
Est-ce que quelque chose comme ça va faire partie de Java 8? Comment puis-je faire une telle suggestion, sinon? Ou y a-t-il une construction équivalente que je pourrais utiliser dès maintenant?
La solution
Utilisant OP4J:
Op.onListFor(a,b,c).get().contains(value);
En utilisant la même approche, vous pouvez créer une classe d'assistance Is
avec une méthode in
:
class Is<T> {
private T value;
public Is( T value ) { this.value = value; }
public boolean in( T... set ) {
for( T item : set ) {
if( value.equals( item ) ) {
return true;
}
}
return false;
}
public static <T> Is<T> is( T value ) {
return new Is<T>( value );
}
}
Avec une importation statique, vous pouvez écrire:
if(is(value).in(a,b,c)) {
}
Autres conseils
Vous pouvez écrire une méthode d'assistance pour le faire.
public static <T> boolean isIn(T t, T... ts) {
for(T t2: ts)
if (t.equals(t2)) return true;
return false;
}
// later
if (isIn(value, a,b,c)) {
} else if (isIn(value, d,e)) {
}
Il y a eu une très vieille proposition Collection littéraux.
Actuellement il y a Sets.newHashSet
en goyave qui est assez similaire à Arrays.asList
.
Vous cherchez le Processus communautaire Java
Je doute que quelque chose comme un opérateur soit mis à disposition, car il existe déjà plusieurs façons de le faire (comme utiliser Switch) comme vous l'avez souligné vous-même.
Et je pense que la liste des exigences pour Project-Coin et J8 est déjà entièrement chargée pour être considérée comme quelque chose.