Java en el operador
-
29-10-2019 - |
Pregunta
Por millonésima vez, me hubiera gustado usar un operador IN
en Java, similar al operador IN
en SQL.Simplemente podría implementarse como azúcar sintáctico del compilador.Entonces esto
if (value in (a, b, c)) {
}
else if (value in (d, e)) {
}
... realmente sería genial.De hecho, lo anterior es lo mismo que la construcción bastante detallada (y no adaptada para primitivas) aquí:
if (Arrays.asList(a, b, c).contains(value)) {
}
else if (Arrays.asList(d, e).contains(value)) {
}
O así para int
, long
y tipos similares:
switch (value) {
case a:
case b:
case c:
// ..
break;
case d:
case e:
// ..
break;
}
O tal vez podría haber implementaciones aún más eficientes.
Pregunta:
¿Algo como esto será parte de Java 8?¿Cómo puedo hacer tal sugerencia, si no?¿O hay alguna construcción equivalente que pueda usar ahora mismo?
Solución
Usando op4j :
Op.onListFor(a,b,c).get().contains(value);
Con el mismo enfoque, podría crear clases auxiliares Is
con un método 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 );
}
}
con una importación estática, puede escribir:
if(is(value).in(a,b,c)) {
}
Otros consejos
Puede escribir un método auxiliar para hacerlo.
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)) {
}
Ha habido una propuesta muy antigua para literales de colección .
Actualmente hay Sets.newHashSet
en Guayaba que es bastante similar a Arrays.asList
.
Está buscando el Proceso de la comunidad Java
Dudo que algo como un operador IN esté disponible, ya que hay varias formas de hacer esto (como usar el interruptor) como usted mismo señaló.
Y creo que la lista de requisitos para project-coin y J8 ya está completamente cargada para ser considerado algo así.