web-dev-qa-db-fra.com

Etat SQL IN en Java

J'ai plusieurs conditions à vérifier comme indiqué ci-dessous,

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
}

Existe-t-il un moyen simple de vérifier les conditions ci-dessus, telles que SQL INcondition, afin que le code paraisse plus simple?

16
Santosh Jadi

Vous pouvez utiliser la méthode matches qui est disponible dans la classe String,

if(pouch.getStatus().matches("Finalized|Ready|Checkout|Confirmed|Book|Started|Inital|Close")){
   //your implementation goes here
}
6
Praveen

Jetons un coup d'oeil sur les fonctionnalités SQL in

SQL WHERE IN renvoie des valeurs qui correspondent aux valeurs d'une liste 


Donc, je voudrais utiliser une collection, qui implémente à partir de Collection<E> et que contient , simplifie la déclaration if.

contains (Object o) Renvoie true si cet ensemble contient l'élément spécifié.

L'effet contains est très similaire à SQL in.


1.ajoutez vos multiples conditions dans la collection, qui implémente à partir de 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. en utilisant contains pour vérifier si la valeur d'entrée existe dans la collection.

if (dict.contains(pouch.getStatus()))
{
     // do your logic
}
13
D-Shih

SQL IN peut renvoyer plusieurs résultats, mais dans votre question, si l'une des conditions est remplie, l'opération se termine et est renvoyée.

Vous pouvez créer une énumération contenant toutes vos conditions, comme indiqué ci-dessous.

En supposant que votre classe Pouch est la suivante.

public class Pouch {

    private final String status;

    public Pouch(final String status) {
        this.status = status;
    }

    public String getStatus() {
        return status;
    }
}

Voici votre enum avec le statut de pochette.

public enum  PouchEnum {
   Finalized, Ready, Checkout, Confirmed, Book, Started, Inital, Close
}

et vérifiez votre état comme indiqué ci-dessous.

if (PouchEnum.valueOf(pouch.getStatus()) != null) {
        // Do some stuff
}

Pour le rendre plus propre, vous pouvez utiliser EnumUtils de Apache commons-lang3 / ceci rend votre vérification de code plus propre, comme indiqué ci-dessous.

if (EnumUtils.isValidEnum(PouchEnum.class, pouch.getStatus())) {
        // Do some stuff
}

J'espère que cela aidera votre code à être plus propre.

5
bellomodi
List<String> listOfInputs = new ArrayList<String>();
// add elements in listOfInputs...  
boolean isAvailable = listOfInputs.contains(pouch.getStatus());
5
raviraja

Vous pouvez créer une fonction personnalisée:

static boolean inCondition(String var, String... ins) {
    for (String in : ins) {
        if (in.equals(var)) return true;
    }

    return false;
}

et ensuite l'utiliser de cette façon:

public static void main(String[] args) {
    String pouch = "Ready";
    if (inCondition(pouch, "Finalized", "Ready", "Checkout" ... )) {
        // do something
    }
}
4
Maxim

L'extrait ci-dessous peut vous aider.

 String status = "COMPLETED";
 List<String> statusList = new ArrayList<>(Arrays.asList("COMPLETED","INPROGRESS"));
 if(statusList.contains(status)){
     // do your stuff
 }
4
Veeresh

Utiliser Arrays.asList puis contains pourrait être le meilleur moyen, du moins dans mon cas. 

if(Arrays.asList("Finalized", "Ready", "Checkout", "Confirmed", 
    "Book", "Started", "Inital", "Close").contains(pouch.getStatus())) {

   // Body
}
3
Akashah Amin

Pour ce scénario particulier, je pense que c'est un bon candidat pour un simple enum comme ceci:

public enum PouchStatus {
    FINALIZED, READY, CHECKOUT, CONFIRMED, BOOK, STARTED, INITIAL, CLOSE
}

Utilisation:

if(PouchStatus.valueOf(pouch.getStatus().toUpperCase()) != null) {
}

Vous pouvez également déplacer cette logique d'assainissement de chaîne à l'intérieur d'une méthode statique dans l'énumération, qui ressemblerait à ceci:

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);
    }
}

Utilisation:

if (PouchStatus.fromDescription(pouch.getStatus()) != null) {
}

Pour terminer, si l’objet Pouch provient d’ORM (par exemple, hibernate/jpa), vous pouvez simplement mapper ces valeurs aux éléments d’énumération correspondants directement dans le mappage d’entités (pouc.getStatus () renverrait déjà un objet PouchStatus au lieu d’un Chaîne).

2
everton

Je pense que si vous utilisez le "commutateur" conditionnel, le code se lit mieux:

switch (pouch.getStatus()) {
            case "Finalized":
            case "Ready":
            case "Checkout":
            case "Confirmed":
            case "Book":
            case "Started":
            case "Inital":
            case "Close":
                // your code
                break;
        }
2

Voici un autre moyen d'initialiser List sur une ligne avec tous les statuts, puis de vérifier si la liste contient le statut donné.

// 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
}
1
pradipforever

Voici un exemple complet 

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
    }

}

 Eclipse demo

1
vipul gulhane

Vous pouvez créer un tableau de tous les statuts, puis vérifier si pouch.getStatus () est dans cette liste ou non?

 public String[] statusArray = new String[]{  "Finalized", "Ready","Checkout","Confirmed",  "Book",  "Started", "Inital", "Close"};

if( Arrays.asList(statusArray).contains(pouch.getStatus())){
 //do something 
}
1
patidarsnju

Il y a déjà beaucoup d'options ici, mais vous pouvez également utiliser Stream pour cette tâche, si la version du JDK que vous utilisez est> = 8:

String status = pouch.getStatus();
if (Stream.of(
        "Finalized",
        "Ready",
        "Checkout",
        "Confirmed",
        "Book",
        "Started",
        "Inital",
        "Close")
        .anyMatch(status::equals)) {
    // Body
}

L'inconvénient de cette méthode, comparé à Collection#contains, est que vous devez vous assurer que pouch.getStatus() n'est pas nul, sinon vous obtiendrez une NullPointerException.

1
Gustavo Passini