【问题标题】:SQL IN condition in JavaJava中的SQL IN条件
【发布时间】:2018-11-25 21:53:19
【问题描述】:

我有多个条件要检查,如下所示,

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 INcondition 的上述条件,以便代码看起来更简单?

【问题讨论】:

标签: java collections conditional-statements hashset where-in


【解决方案1】:

我们来看看SQLin的特性

SQL WHERE IN 返回与列表中的值匹配的值


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

contains(Object o) 如果此集合包含指定元素,则返回 true。

contains 效果与 SQL in 非常相似。


1.在集合中添加你的多个条件,从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.使用contains检查输入值是否存在于集合中。

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

【讨论】:

    【解决方案2】:

    您可以使用String 类中提供的方法matches

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

    【讨论】:

      【解决方案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
        }
        

        为了使其更简洁,您可以使用 apache commons-lang3 中的 EnumUtils,这会使您的代码检查更简洁,如下所示。

        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】:

            下面的 sn-p 可能会对你有所帮助。

             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 对象而不是字符串)。

                  【讨论】:

                    【解决方案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
                        }
                    
                    }
                    

                    【讨论】:

                      【解决方案11】:

                      这是另一种在一行中初始化所有状态的 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
                      }
                      

                      【讨论】:

                        【解决方案12】:

                        您可以创建一个包含所有状态的数组,然后检查 pouch.getStatus() 是否在该列表中?

                         public String[] statusArray = new String[]{  "Finalized", "Ready","Checkout","Confirmed",  "Book",  "Started", "Inital", "Close"};
                        
                        if( Arrays.asList(statusArray).contains(pouch.getStatus())){
                         //do something 
                        }
                        

                        【讨论】:

                          【解决方案13】:

                          这里已经有很多选项,但如果您使用的 JDK 版本 >= 8,您也可以使用 Stream 执行此任务:

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

                          Collection#contains相比,这种方法的缺点是你必须确保pouch.getStatus()不为空,否则你会得到一个NullPointerException

                          【讨论】:

                            猜你喜欢
                            • 1970-01-01
                            • 2012-03-09
                            • 2020-07-03
                            • 2015-08-08
                            • 1970-01-01
                            • 1970-01-01
                            • 1970-01-01
                            • 1970-01-01
                            • 2011-03-25
                            相关资源
                            最近更新 更多