SQL 处于 Java 状态

SQL IN condition 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 Implementation
}

有没有简单的方法来检查类似SQL IN条件的上述条件,让代码看起来更简单?

让我们来看看 SQL in 的特点

SQL WHERE IN returns values that match values in a list


所以我会使用一个集合,它实现了 Collection<E> and had contains 方法,使 if 语句更简单。

contains(Object o) Returns true if this set contains the specified element.

contains效果与SQLin.

非常相似

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

您可以创建自定义函数:

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
 }

我认为如果你使用 "switch" 条件,代码读起来会更好:

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

您可以使用 matches 方法 String class,

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

SQL IN 可能 return 多个结果,但在您的问题中,如果满足一个条件,操作将终止并且 return.

您可以创建一个枚举来保存您的所有条件,如下所示。

假设您的小袋 class 是这个。

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
}

为了让它更干净,你可以使用来自 apache commons-lang3 的 EnumUtils,这会让你的代码检查更干净,如下所示。

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

我希望这能帮助您的代码更简洁。

对于这个特定的场景,我认为它是一个很好的候选 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() 已经 return 一个 PouchStatus 对象而不是一个字符串)。

使用 Arrays.asList 然后使用 contains 可能是最好的方法,至少对我来说是这样。

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

   // Body
}

这里是完整的例子

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.

这是另一种在一行中初始化包含所有状态的列表,然后检查列表是否包含给定状态的方法。

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