Java 是否有一种简单的方法来编码多个if条件?

Java 是否有一种简单的方法来编码多个if条件?,java,Java,我有下面一段Java代码。我需要执行所有的if语句。是否有更好的方法来编写代码。在每个语句中,我都会进行数据库调用 if (!keyAccntId.equalsIgnoreCase("-1") && !(segmentId.equalsIgnoreCase("-1")) && !(regionId.equalsIgnoreCase("-1"))) { templateOrder.add("1"); } if (!keyAccntId.equalsIgnor

我有下面一段Java代码。我需要执行所有的if语句。是否有更好的方法来编写代码。在每个语句中,我都会进行数据库调用

if (!keyAccntId.equalsIgnoreCase("-1") && !(segmentId.equalsIgnoreCase("-1")) && !(regionId.equalsIgnoreCase("-1"))) {
    templateOrder.add("1");
}
if (!keyAccntId.equalsIgnoreCase("-1") && (segmentId.equalsIgnoreCase("-1")) && !(regionId.equalsIgnoreCase("-1"))) {
    templateOrder.add("2");
}
if (!keyAccntId.equalsIgnoreCase("-1") && (segmentId.equalsIgnoreCase("-1")) && (regionId.equalsIgnoreCase("-1"))) {
    templateOrder.add("3");
}
if (keyAccntId.equalsIgnoreCase("-1") && !(segmentId.equalsIgnoreCase("-1")) && !(regionId.equalsIgnoreCase("-1"))) {
    templateOrder.add("4");
}
if (keyAccntId.equalsIgnoreCase("-1") && (segmentId.equalsIgnoreCase("-1")) && !(regionId.equalsIgnoreCase("-1"))) {
    templateOrder.add("5");
}
if (keyAccntId.equalsIgnoreCase("-1") && (segmentId.equalsIgnoreCase("-1")) && (regionId.equalsIgnoreCase("-1"))) {
    templateOrder.add("6");
}

您可以创建位掩码并打开它:

public static final int KEY = 1;
public static final int SEGMENT = 2;
public static final int REGION = 4;

int value = 0;

if (keyAccntId.equalsIgnoreCase("-1")) {
    value += KEY;
}
if (segmentId.equalsIgnoreCase("-1")) {
    value += SEGMENT;
}
if (regionId.equalsIgnoreCase("-1")) {
    value += REGION;
}
这将为您提供8个可能的值,您可以打开这些值:

switch(value) {
case 0:
    // All false
    break;
case KEY:
    // only keyAccntId is true
    break;
case REGION:
    // only segmentId is true
    break;
case KEY + REGION:
    // segmentId and keyAccntId are true
    break;
// So on
}
编辑
添加常量以提高可读性

以使事情在视觉上更容易您可以执行以下操作

boolean keyTF = keyAccntId.equalsIgnoreCase("-1"), 
segmentTF = segmentId.equalsIgnoreCase("-1"), 
regionTF = regionId.equalsIgnoreCase("-1");

if (!keyTF  && !segmentTF  && !regionTF ) {
    templateOrder.add("1");
}
if (!keyTF  && segmentTF  && !regionTF ) {
    templateOrder.add("2");
}
if (!keyTF  && segmentTF  && regionTF ) {
    templateOrder.add("3");
}
if (keyTF  && !segmentTF  && !regionTF ) {
    templateOrder.add("4");
}
if (keyTF  && segmentTF  && !regionTF ) {
    templateOrder.add("5");
}
if (keyTF  && segmentTF  && regionTF ) {
    templateOrder.add("6");
}
但问题是,你正在处理一个逻辑真值表,你只需要一步一步地处理所有的可能性。由于您使用的是3个独立的变量,因此无法进一步压缩代码

FFF
FTF
FTT
TFF
TTF
TTT

实际上,您缺少了TFT案例:)

使用Java 7的@njzk2答案的较短版本

public static final int KEY = 0b001, SEGMENT = 0b010, REGION = 0b100;

int comb = (keyAccntId.equals("-1") ? KEY : 0) +
        (segmentId.equals("-1") ? SEGMENT : 0) +
        (regionId.equals("-1") ? REGION : 0);
switch(comb) {
     case 0:       /* none are true. */ break;
     case REGION:  /* only regionId is -1 */ break;
     // more combinations.
     case KEY + SEGMENT + REGION: /* all are -1 */ break;
}
没有“如果”,没有“开关”。这三行将涵盖您的所有案例:

 int val = keyAccntId.equals("-1")? 3:0;
 val += ((segmentId.equals("-1")? 1:0) + (regionId.equals("-1")? 1:0);
 templateOrder.add(val+1+"");

您可能希望封装代码,因此最终会是这样:

public int getTemplateOrder(int keyAccntId, int segmentId, int regionId){
  int val = keyAccntId.equals("-1")? 3:0;
  return val + (segmentId.equals("-1")? 1:0) + (regionId.equals("-1")? 1:0) + 1;
}

//Usage
templateOrder.add(getTemplateOrder(keyAccntId, segmentId, regionId)+"");
keyAccntId.equalsIgnoreCase("-1") |       F       |       T       |
segmentId.equalsIgnoreCase("-1")  |   F   |   T   |   F   |   T   |
regionId.equalsIgnoreCase("-1")   | F | T | F | T | F | T | F | T |
----------------------------------+---+---+---+---+---+---+---+---+
n += 4;                           | - | - | - | - | y | y | y | y |
n += 2;                           | - | - | y | y | - | - | y | y |
n += 1;                           | - | y | - | y | - | y | - | y |
templateOrder.add(arg);           | y | - | y | y | y | - | y | y |
----------------------------------+---+---+---+---+---+---+---+---+

为了便于阅读,这三行是:

   int acc = keyAccntId.equals("-1")? 3:0;
   int seg = segmentId.equals("-1")? 1:0;
   int reg = regionId.equals("-1")? 1:0;
   int val = acc;

   //Construct the value currently being used on each If statement.
   val += seg + reg;

   //You've got the value, so instead of If/switch, just set it.
   templateOrder.add(val+1+"");
我希望它不是太模糊


关于。

只有六种可能的组合会导致调用
add
方法

我们注意到,
add
方法在OP代码中只调用一次,因为if语句中的条件是互斥的。。。如果其中一个值为TRUE,其他值将返回FALSE

要使用逻辑真理表进行老派学习:

keyAccntId.equalsIgnoreCase("-1") |       F       |       T       |
segmentId.equalsIgnoreCase("-1")  |   F   |   T   |   F   |   T   |
regionId.equalsIgnoreCase("-1")   | F | T | F | T | F | T | F | T |
----------------------------------+---+---+---+---+---+---+---+---+
templateOrder.add("1");           | y | - | - | - | - | - | - | - |
templateOrder.add("2");           | - | - | y | - | - | - | - | - |
templateOrder.add("3");           | - | - | - | y | - | - | - | - |
templateOrder.add("4");           | - | - | - | - | y | - | - | - |
templateOrder.add("5");           | - | - | - | - | - | - | y | - |
templateOrder.add("6");           | - | - | - | - | - | - | - | y |
----------------------------------+---+---+---+---+---+---+---+---+
如果结果值与条件更好地“对齐”,则可以减少进行比较的次数

int n = 0;
if (keyAccntId.equalsIgnoreCase("-1") {
  n += 4;
} 
if (segmentId.equalsIgnoreCase("-1") {
  n += 2;
}  
if (regionId.equalsIgnoreCase("-1") {
  n += 1;
}
templateOrder.add(String.valueOf(n));
注意:上述代码与OP代码不等效。为了使其执行等效操作,我们需要添加一个条件测试,以便在n为1或5时不调用
add
方法,并将
n
的值转换为指定的字符串参数值:

n    arg
---  ----
0    "1"
1    - 
2    "2"
3    "3"
4    "4"
5    -
6    "5"
7    "6"
逻辑表如下所示:

public int getTemplateOrder(int keyAccntId, int segmentId, int regionId){
  int val = keyAccntId.equals("-1")? 3:0;
  return val + (segmentId.equals("-1")? 1:0) + (regionId.equals("-1")? 1:0) + 1;
}

//Usage
templateOrder.add(getTemplateOrder(keyAccntId, segmentId, regionId)+"");
keyAccntId.equalsIgnoreCase("-1") |       F       |       T       |
segmentId.equalsIgnoreCase("-1")  |   F   |   T   |   F   |   T   |
regionId.equalsIgnoreCase("-1")   | F | T | F | T | F | T | F | T |
----------------------------------+---+---+---+---+---+---+---+---+
n += 4;                           | - | - | - | - | y | y | y | y |
n += 2;                           | - | - | y | y | - | - | y | y |
n += 1;                           | - | y | - | y | - | y | - | y |
templateOrder.add(arg);           | y | - | y | y | y | - | y | y |
----------------------------------+---+---+---+---+---+---+---+---+


我会把它转换成一个位掩码,并使用一个开关。位掩码解决方案解决了眼前的问题。但我的直觉是,实际目标值得怀疑。也许你应该解释一下“templateOrder”是什么以及你要用它做什么(或者这只是实际数据库调用的占位符?)你不需要
equalsIgnoreCase
doe一个数字,因为它没有大小写,试着
equals(“-1”)
BTW有8种可能的结果,有两个结果你没有数字。如果
segmentId.equals(“-1”)和®ionId.equals(“-1”)
你什么都不做。@Peter Lawrey:只复制了上面的6条。条件确实存在。我给了你一张赞成票,因为这似乎是一个好的方向。但我忍不住觉得这有点难读。它可以很好地扩展,这是一个很好的特性。这不就是重新组织他的选项树吗?这是有帮助的,但也许对他来说,在视觉上清理东西更有帮助。?邓肯我同意。一种更好的方法是为每个项目使用常量,并在开关中使用它们(
values+=Const.KEY
case Const.KEY&Const.SEGMENT
用于实例)@njzk2是的,这将是一个巨大的改进。如果您在答案中包含这样的代码,您的答案可能更容易阅读。您需要
KEY+REGION
KEY | REGION
,因为
KEY®ION
0
它不会简化。也许它更具可读性,但这不是简单化。这不符合需要。我认为您应该在
switch
语句之前计算
switch
值,以使其更具可读性。您确定吗?我认为当所有条件都为false时,结果val将为0,并且返回-1Good catch!让我来解决这个问题。@SyamS现在怎么办?我喜欢。我在想这样的事情。理想情况下,如果
模板顺序
具有二进制序列,则此解决方案是正确的。但根据问题,如果是5,订单将丢失。
templateOrder=5的条件被视为6的二进制数
(110)
。这就是问题所在。但解决方案为+1;)对在你的情况下,它返回6。问题是他没有条件
keyAccntId==-1&&segmentId!=-1&®ionId==-1