ejemplo - Condición de SQL IN en Java
java collection hashset (13)
Tengo varias condiciones para verificar como se muestra a continuación,
if(pouch.getStatus().equals("Finalized") || pouch.getStatus().equals("Ready")
|| pouch.getStatus().equals("Checkout") || pouch.getStatus().equals("Confirmed")
|| pouch.getStatus().equals("Book") || pouch.getStatus().equals("Started")
|| pouch.getStatus().equals("Inital") || pouch.getStatus().equals("Close")) {
// Body
}
¿Hay alguna manera fácil de verificar las condiciones anteriores similares a las condiciones de SQL IN , para que el código parezca más simple?
Aquí está el ejemplo completo
public class InConditionJava {
public static void main(String[] args) {
// TODO Auto-generated method stub
String[] arr = { "Finalized", "Ready", "Checkout" };
checkData(arr);
}
private static void checkData(String[] arr) {
Set<String> names = new HashSet<String>(Arrays.asList(arr));
System.out.println("AS Checkout is there in our arr is should return True>>" + names.contains("Checkout")); // true
System.out.println(names.contains("Book")); // false
}
}
Creo que si usas el condicional "switch", el código se lee mejor:
switch (pouch.getStatus()) {
case "Finalized":
case "Ready":
case "Checkout":
case "Confirmed":
case "Book":
case "Started":
case "Inital":
case "Close":
// your code
break;
}
Debajo de un fragmento puede ayudarte.
String status = "COMPLETED";
List<String> statusList = new ArrayList<>(Arrays.asList("COMPLETED","INPROGRESS"));
if(statusList.contains(status)){
// do your stuff
}
Echemos un vistazo sobre SQL in características
SQL WHERE
INdevuelve valores que coinciden con los valores de una lista
Así que usaría una colección, que se implementa desde la Collection<E> y tenía el método contains , simplificando la instrucción if .
contiene (Objeto o) Devuelve verdadero si este conjunto contiene el elemento especificado.
contains efecto es muy similar a SQL in .
1.add sus múltiples condiciones en la colección, que se implementa desde la Collection<E>
Set<String> dict = new HashSet<String>();
dict.add("Finalized");
dict.add("Ready");
dict.add("Checkout");
dict.add("Confirmed");
dict.add("Book");
dict.add("Started");
dict.add("Inital");
dict.add("Close");
2.using utiliza para verificar el valor de entrada si existe en la colección.
if (dict.contains(pouch.getStatus()))
{
// do your logic
}
El uso de Arrays.asList y luego el uso de los contains podría ser la mejor manera, al menos en mi caso.
if(Arrays.asList("Finalized", "Ready", "Checkout", "Confirmed",
"Book", "Started", "Inital", "Close").contains(pouch.getStatus())) {
// Body
}
Esta es otra forma de inicializar la Lista en una línea con todos los estados, y luego verificar si la lista contiene el estado dado.
// Java 9 way of initializing List with one line
List<String> statuses = List.of("Finalized", "Ready", "Checkout", "Confirmed",
"Book", "Started", "Inital", "Close");
if (statuses.contains(pouch.getStatus())) {
// Body
}
Para este escenario en particular, creo que es un buen candidato para una enum simple como esta:
public enum PouchStatus {
FINALIZED, READY, CHECKOUT, CONFIRMED, BOOK, STARTED, INITIAL, CLOSE
}
Uso:
if(PouchStatus.valueOf(pouch.getStatus().toUpperCase()) != null) {
}
También puede mover esta lógica de desinfección de cadena dentro de un método estático en la enumeración, que se vería así:
public enum PouchStatus {
FINALIZED, READY, CHECKOUT, CONFIRMED, BOOK, STARTED, INITIAL, CLOSE
public static PouchStatus fromDescription(String desc) {
return Arrays.stream(PouchStatus.values()).filter(e -> e.name().equalsIgnoreCase(desc)).findFirst().orElse(null);
}
}
Uso:
if (PouchStatus.fromDescription(pouch.getStatus()) != null) {
}
Como nota final, si el objeto Pouch proviene de ORM (por ejemplo, hibernate / jpa), puede asignar estos valores a los elementos de enumeración correspondientes en la asignación de entidades (pouc.getStatus () ya devolvería un objeto PouchStatus en lugar de un Cuerda).
Puede crear una función personalizada:
static boolean inCondition(String var, String... ins) {
for (String in : ins) {
if (in.equals(var)) return true;
}
return false;
}
y luego usarlo de esta manera:
public static void main(String[] args) {
String pouch = "Ready";
if (inCondition(pouch, "Finalized", "Ready", "Checkout" ... )) {
// do something
}
}
Puede crear una matriz de todos los estados y luego verificar si pouch.getStatus () está en esa lista o no.
public String[] statusArray = new String[]{ "Finalized", "Ready","Checkout","Confirmed", "Book", "Started", "Inital", "Close"};
if( Arrays.asList(statusArray).contains(pouch.getStatus())){
//do something
}
Puedes usar las matches métodos que están disponibles en String clase String ,
if(pouch.getStatus().matches("Finalized|Ready|Checkout|Confirmed|Book|Started|Inital|Close")){
//your implementation goes here
}
SQL IN puede devolver más de un resultado, pero en su pregunta, si se cumple una condición, la operación terminará y volverá.
Puede crear una enumeración para mantener todas sus condiciones como se muestra a continuación.
Suponiendo que tu clase de bolsa es esto.
public class Pouch {
private final String status;
public Pouch(final String status) {
this.status = status;
}
public String getStatus() {
return status;
}
}
Aquí está su enumeración con el estado de la bolsa.
public enum PouchEnum {
Finalized, Ready, Checkout, Confirmed, Book, Started, Inital, Close
}
y verifique su condición como se muestra a continuación.
if (PouchEnum.valueOf(pouch.getStatus()) != null) {
// Do some stuff
}
Para hacerlo más limpio, puede usar EnumUtils de apache commons-lang3; esto hace que su código sea más limpio como se muestra a continuación.
if (EnumUtils.isValidEnum(PouchEnum.class, pouch.getStatus())) {
// Do some stuff
}
Espero que esto ayude a que su código sea más limpio.
Ya hay muchas opciones aquí, pero también podría usar Stream para esta tarea, si la versión del JDK que está utilizando es> = 8:
String status = pouch.getStatus();
if (Stream.of(
"Finalized",
"Ready",
"Checkout",
"Confirmed",
"Book",
"Started",
"Inital",
"Close")
.anyMatch(status::equals)) {
// Body
}
La desventaja de este método, en comparación con la Collection#contains , es que debe asegurarse de que pouch.getStatus() no sea nulo, de lo contrario obtendrá una NullPointerException .
List<String> listOfInputs = new ArrayList<String>();
// add elements in listOfInputs...
boolean isAvailable = listOfInputs.contains(pouch.getStatus());