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