我在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");
}
答案 0 :(得分:16)
您可以创建一个位掩码并启用它:
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
}
添加常量以提高可读性
答案 1 :(得分:7)
@ njzk2使用Java 7的答案的缩短版本。
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;
}
答案 2 :(得分:2)
否“如果”,否则“切换”。这3行将涵盖您的所有情况:
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)+"");
为了便于阅读,这些是3行:
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+"");
我希望它不会太模糊。
问候。
答案 3 :(得分:0)
为了让视觉上更容易,你可以做这样的事情......
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案例:)
答案 4 :(得分:0)
只有六种可能的组合会导致调用add
方法。
我们注意到add
方法只在OP代码中调用一次,因为if语句中的条件是互斥的...如果其中一个的计算结果为TRUE,则其他的将返回FALSE。 / p>
带着逻辑真值表去老学校:
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"
逻辑表看起来像这样:
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 |
----------------------------------+---+---+---+---+---+---+---+---+