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 WHEREIN
返回与列表中的值匹配的值
因此,我将使用一个集合,它实现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
}
看见这显然是重复的。