Условие SQL IN в Java

У меня есть несколько условий для проверки, как показано ниже,

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
}

Есть ли какой-либо простой способ проверить условия, аналогичные SQL IN, чтобы код выглядел проще?

Ответы

Ответ 1

Вы можете использовать matches методов, доступные в классе String,

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

Ответ 2

Давайте взглянем на SQL in функциях

SQL WHERE IN возвращает значения, соответствующие значениям в списке


Поэтому я бы использовал коллекцию, которая реализует из Collection<E> и содержала метод, упростила if оператор if.

contains (Object o) Возвращает true, если этот набор содержит указанный элемент.

contains эффект, очень похожий на SQL in.


1.add ваши многочисленные условия в коллекции, которые реализуются из 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 contains для проверки входного значения, существуют ли в коллекции.

if (dict.contains(pouch.getStatus()))
{
     // do your logic
}

Ответ 3

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

Ответ 4

SQL IN может возвращать более одного результата, но в вашем вопросе, если выполняется одно условие, операция завершится и вернется.

Вы можете создать перечисление для хранения всех ваших условий, как показано ниже.

Предположим, что ваш класс Pouch - это.

public class Pouch {

    private final String status;

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

    public String getStatus() {
        return status;
    }
}

Вот ваше перечисление с статусом мешка.

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

и проверьте свое состояние, как показано ниже.

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

Чтобы сделать его более чистым, вы можете использовать EnumUtils из apache commons-lang3, чтобы ваш код стал более чистым, как показано ниже.

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

Надеюсь, это поможет вашему коду быть чище.

Ответ 5

Вы можете создать пользовательскую функцию:

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

    return false;
}

а затем использовать его таким образом:

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

Ответ 6

Ниже фрагмента может помочь вам.

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

Ответ 7

Использование Arrays.asList а затем использование contains может быть лучшим способом, по крайней мере, на моем случае.

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

   // Body
}

Ответ 8

Я думаю, что если вы используете условный ключ "switch", код читается лучше:

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

Ответ 9

Для этого конкретного сценария я считаю это хорошим кандидатом для простого enum следующим образом:

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

Использование:

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

Вы также можете переместить эту строковую санирующую логику внутри статического метода в перечислении, который будет выглядеть следующим образом:

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

Использование:

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

В качестве заключительной заметки, если объект Pouch происходит из ORM (например: hibernate/jpa), вы можете просто сопоставить эти значения с соответствующими элементами перечисления прямо в сопоставлении сущности (pouc.getStatus() уже вернет объект PouchStatus вместо String).

Ответ 10

Вот полный пример

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

Ответ 11

Здесь уже много вариантов, но вы также можете использовать Stream для этой задачи, если версия JDK, которую вы используете, составляет> = 8:

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

Недостатком этого метода, по сравнению с Collection#contains, является то, что вы должны убедиться, что pouch.getStatus() не является нулевым, иначе вы получите NullPointerException.

Ответ 12

Вот еще один способ инициализации List в одной строке со всеми статусами, а затем проверка, содержит ли список данный статус.

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

Ответ 13

Вы можете создать массив всех статусов, а затем проверить, есть ли в этом списке pouch.getStatus() или нет?

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

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