Compara una cadena con múltiples valores en una expresión

Tengo una variable String, str con valores posibles, val1 , val2 y val3 .

Quiero comparar (con igual caso) str con todos estos valores usando una instrucción if, por ejemplo:

 if("val1".equalsIgnoreCase(str)||"val2".equalsIgnoreCase(str)||"val3.equalsIgnoreCase(str)) { //remaining code } 

¿Hay alguna forma de evitar el uso de múltiples operadores OR (||) y comparar valores en una expresión? Por ejemplo, así:

  if(("val1" OR "val2" OR "val3").equalsIgnoreCase(str) //this is only an idea. 

Encontré la mejor solución. Esto se puede lograr a través de RegEx:

 if (str.matches("val1|val2|val3")) { // remaining code } 

Para correspondencia insensible a mayúsculas y minúsculas:

 if (str.matches("(?i)val1|val2|val3")) { // remaining code } 

En Java 8+, puede usar un Stream y anyMatch(Predicate< ? super T>) con algo como

 if (Stream.of("val1", "val2", "val3").anyMatch(str::equalsIgnoreCase)) { // ... } 

Puede almacenar todas las cadenas con las que desea comparar str en una colección y comprobar si la colección contiene str . Almacene todas las cadenas en la colección como minúsculas y convierta str en minúsculas antes de consultar la colección. Por ejemplo:

 Set strings = new HashSet(); strings.add("val1"); strings.add("val2"); String str = "Val1"; if (strings.contains(str.toLowerCase())) { } 

Pequeña mejora a la respuesta @ hmjd perfectamente válida: puede usar la siguiente syntax:

 class A { final Set strings = new HashSet<>() {{ add("val1"); add("val2"); }}; // ... if (strings.contains(str.toLowerCase())) { } // ... } 

Le permite inicializarlo Set in-place.

Simplemente use var-args y escriba su propio método estático:

 public static boolean compareWithMany(String first, String next, String ... rest) { if(first.equalsIgnoreCase(next)) return true; for(int i = 0; i < rest.length; i++) { if(first.equalsIgnoreCase(rest[i])) return true; } return false; } public static void main(String[] args) { final String str = "val1"; System.out.println(compareWithMany(str, "val1", "val2", "val3")); } 

ArrayUtils puede ser útil.

 ArrayUtils.contains(new String[]{"1", "2"}, "1") 

Puede lograr esto con el marco de Colecciones. Ponga todas sus opciones en una Colección, diga algo así como las Collection options ;

A continuación, repita esto para comparar su cadena con los elementos de la lista y, si es así, puede devolver un valor booleano verdadero y, de lo contrario, falso.

Recuerde que en Java una cadena entrecomillada sigue siendo un objeto String. Por lo tanto, puede usar la función String contains () para probar un rango de cadenas o enteros usando este método:

 if ("AC Viking GM Ocelot".contains(mAnswer)) {...} 

para los números es un poco más complicado, pero aún funciona:

 if ("1 4 5 9 10 17 23 96457".contains(String.valueOf(mNumAnswer))) {...} 

No, no hay tal posibilidad. Sin embargo, uno podría imaginar:

 public static boolean contains(String s, Collectionc) { for (String ss : c) { if (s.equalsIgnoreCase(ss)) return true; } return false; } 
 !string.matches("a|b|c|d") 

funciona bien para mí