precedencia - Java en el operador
operadores relacionales en java (5)
Dudo que algo como un operador IN esté disponible, ya que hay varias maneras de hacerlo (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 que sea algo así para ser considerado.
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. Así que esto
if (value in (a, b, c)) {
}
else if (value in (d, e)) {
}
... sería realmente increíble. De hecho, lo anterior es lo mismo que el constructo bastante detallado (y no adaptado para primitivos) aquí:
if (Arrays.asList(a, b, c).contains(value)) {
}
else if (Arrays.asList(d, e).contains(value)) {
}
O como este 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 va a ser parte de Java 8? ¿Cómo puedo hacer tal sugerencia, si no? ¿O hay alguna construcción equivalente que pueda usar ahora?
Está buscando el Proceso de comunidad de Java
Ha habido una propuesta muy antigua para los literales de colección .
Actualmente existe Sets.newHashSet
en Guava, que es bastante similar a Arrays.asList
.
Puedes escribir un método de ayuda 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)) {
}
Usando op4j :
Op.onListFor(a,b,c).get().contains(value);
Usando el mismo enfoque, podrías crear clases auxiliares 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)) {
}