Ответ 1
Вы можете использовать matches
методов, доступные в классе String
,
if(pouch.getStatus().matches("Finalized|Ready|Checkout|Confirmed|Book|Started|Inital|Close")){
//your implementation goes here
}
У меня есть несколько условий для проверки, как показано ниже,
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
, чтобы код выглядел проще?
Вы можете использовать matches
методов, доступные в классе String
,
if(pouch.getStatus().matches("Finalized|Ready|Checkout|Confirmed|Book|Started|Inital|Close")){
//your implementation goes here
}
Давайте взглянем на 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
}
List<String> listOfInputs = new ArrayList<String>();
// add elements in listOfInputs...
boolean isAvailable = listOfInputs.contains(pouch.getStatus());
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
}
Надеюсь, это поможет вашему коду быть чище.
Вы можете создать пользовательскую функцию:
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
}
}
Ниже фрагмента может помочь вам.
String status = "COMPLETED";
List<String> statusList = new ArrayList<>(Arrays.asList("COMPLETED","INPROGRESS"));
if(statusList.contains(status)){
// do your stuff
}
Использование Arrays.asList
а затем использование contains
может быть лучшим способом, по крайней мере, на моем случае.
if(Arrays.asList("Finalized", "Ready", "Checkout", "Confirmed",
"Book", "Started", "Inital", "Close").contains(pouch.getStatus())) {
// Body
}
Я думаю, что если вы используете условный ключ "switch", код читается лучше:
switch (pouch.getStatus()) {
case "Finalized":
case "Ready":
case "Checkout":
case "Confirmed":
case "Book":
case "Started":
case "Inital":
case "Close":
// your code
break;
}
Для этого конкретного сценария я считаю это хорошим кандидатом для простого 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).
Вот полный пример
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
}
}
Здесь уже много вариантов, но вы также можете использовать 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
.
Вот еще один способ инициализации 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
}
Вы можете создать массив всех статусов, а затем проверить, есть ли в этом списке pouch.getStatus() или нет?
public String[] statusArray = new String[]{ "Finalized", "Ready","Checkout","Confirmed", "Book", "Started", "Inital", "Close"};
if( Arrays.asList(statusArray).contains(pouch.getStatus())){
//do something
}