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 IN
condition, afin que le code paraisse plus simple?
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
}
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
}
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.
List<String> listOfInputs = new ArrayList<String>();
// add elements in listOfInputs...
boolean isAvailable = listOfInputs.contains(pouch.getStatus());
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
}
}
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
}
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
}
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).
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;
}
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
}
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
}
}
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
}
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
.