Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java中的SQL条件_Java_Collections_Conditional Statements_Hashset_Where In - Fatal编程技术网

Java中的SQL条件

Java中的SQL条件,java,collections,conditional-statements,hashset,where-in,Java,Collections,Conditional Statements,Hashset,Where In,我有多个条件要检查,如下所示 if(pouch.getStatus().equals("Finalized") || pouch.getStatus().equals("Ready") || pouch.getStatus().equals("Checkout") || pouch.getStatus().equals("Confirmed") || pouch.getStatus().equals("Book") || pouch.getStatus().equals("Starte

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

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
,从而使代码看起来更简单?

让我们看看
功能中的SQL

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


因此,我将使用一个集合,它实现from和had方法,使
if
语句更简单

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

包含的
效果与
中的SQL
非常相似


1.在集合中添加您的多个条件,这将从
collection

List listOfInputs=new ArrayList();
//在输入列表中添加元素。。。
布尔值isAvailable=listOfInputs.contains(pocket.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
 }
String status=“已完成”;
列表状态列表=新的ArrayList(Arrays.asList(“已完成”、“正在进行”);
if(statusList.contains(status)){
//做你的事
}
我认为如果使用“开关”条件,代码读起来会更好:

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

您可以使用
matches
方法,该方法在
String
类中提供

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

中的SQL
可能返回多个结果,但在您的问题中,如果满足一个条件,则操作将终止并返回

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

if (PouchEnum.valueOf(pouch.getStatus()) != null) {
        // Do some stuff
}
if (EnumUtils.isValidEnum(PouchEnum.class, pouch.getStatus())) {
        // Do some stuff
}
假设你的邮袋等级是这个

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
}
if (EnumUtils.isValidEnum(PouchEnum.class, pouch.getStatus())) {
        // Do some stuff
}
为了使它更干净,您可以使用apachecommons-lang3中的enumultils,这使您的代码检查更干净,如下所示

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

我希望这将有助于您的代码更干净。

对于这个特定场景,我认为它是一个很好的示例,可以使用简单的
enum
,如下所示:

public enum PouchStatus {
    FINALIZED, READY, CHECKOUT, CONFIRMED, BOOK, STARTED, INITIAL, CLOSE
}
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.valueOf(pouch.getStatus().toUpperCase()) != null) {
}
if (PouchStatus.fromDescription(pouch.getStatus()) != null) {
}
您还可以将此字符串清理逻辑移动到枚举中的静态方法中,如下所示:

public enum PouchStatus {
    FINALIZED, READY, CHECKOUT, CONFIRMED, BOOK, STARTED, INITIAL, CLOSE
}
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.valueOf(pouch.getStatus().toUpperCase()) != null) {
}
if (PouchStatus.fromDescription(pouch.getStatus()) != null) {
}

最后请注意,如果
backs
对象来自ORM(例如:hibernate/jpa),您可以将这些值映射到实体映射中相应的枚举元素(pouc.getStatus()将已经返回一个backStatus对象而不是字符串).

使用
数组。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
    }

}
Java中的公共类{ 公共静态void main(字符串[]args){ //TODO自动生成的方法存根 字符串[]arr={“已完成”、“准备就绪”、“签出”}; 检查数据(arr); } 私有静态无效检查数据(字符串[]arr){ 集合名称=新的HashSet(Arrays.asList(arr)); System.out.println(“因为我们的arr is中存在签出,所以应该返回True>>”+names.contains(“签出”);//True System.out.println(names.contains(“Book”);//false } }

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

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

Collection#contains
相比,此方法的缺点是必须确保
backs.getStatus()
不为null,否则将得到一个
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
}
//Java 9用一行初始化列表的方法
列表状态=列表(“已完成”、“准备就绪”、“签出”、“已确认”,
“书”、“开始”、“开始”、“结束”);
if(statuses.contains(pocket.getStatus())){
//身体
}

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

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

if( Arrays.asList(statusArray).contains(pouch.getStatus())){
 //do something 
}
看见这显然是重复的。