Java em operador
-
29-10-2019 - |
Pergunta
Pela milionésima vez, eu gostaria de usar um operador IN
em Java, semelhante ao operador IN
em SQL.Ele poderia ser implementado apenas como açúcar sintático do compilador.Então, isso
if (value in (a, b, c)) {
}
else if (value in (d, e)) {
}
... seria realmente incrível.Na verdade, o acima é o mesmo que a construção bastante detalhada (e não adaptada para primitivos) aqui:
if (Arrays.asList(a, b, c).contains(value)) {
}
else if (Arrays.asList(d, e).contains(value)) {
}
Ou assim para int
, long
e tipos semelhantes:
switch (value) {
case a:
case b:
case c:
// ..
break;
case d:
case e:
// ..
break;
}
Ou talvez possa haver implementações ainda mais eficientes.
Pergunta:
Algo assim fará parte do Java 8?Como posso fazer tal sugestão, se não?Ou existe alguma construção equivalente que eu possa usar agora?
Solução
Usando op4j :
Op.onListFor(a,b,c).get().contains(value);
Usando a mesma abordagem, você poderia criar classes auxiliares Is
com um 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 );
}
}
com uma importação estática, você pode escrever:
if(is(value).in(a,b,c)) {
}
Outras dicas
Você pode escrever um método auxiliar para fazer isso.
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)) {
}
Existe uma proposta muito antiga para literais de coleção .
Atualmente existe Sets.newHashSet
no Guava, que é muito semelhante a Arrays.asList
.
Você está procurando o Processo da comunidade Java
Duvido que algo como um operador IN seja disponibilizado, pois já existem várias maneiras de fazer isso (como usar switch), como você mesmo indicou.
E acho que a lista de requisitos para project-coin e J8 já está totalmente carregada para ser considerada como esta.