将单行if语句拆分为多行if语句

时间:2017-01-31 10:26:16

标签: java

我试图将单行if语句拆分为具有相同含义的multiline if语句。我有:

 if(a || (b && c))
 {
    /* do smt */
 } 

但是想把它改成像我想要的那样

if(a && b && c)
{
  /*do smt*/
}

具有与

相同的含义
if(a)
{
  if(b)
  {
     if(c)
     {
         /* do smt */
     }
  }
}

谢谢!

5 个答案:

答案 0 :(得分:1)

布尔代数可以改变这种条件

a || (b&& c)进入

(a || b)&& (a || c)

所以你可以这样做:

if(a || b)
 {
    if(a || c){
    /* do smt */
 } 
}

答案 1 :(得分:1)

如果不重复if块的主体,就无法真正做到这一点。您可以将a || b转换为!(!a && !b),但这会使用&&,但由于周围if,您无法将其拆分为嵌套!(...)语句

为什么你想首先这样做?我的假设是abc这三个条件非常长和/或复杂。如果是这种情况,我会建议以下之一:

  • 使用描述性名称声明三个布尔变量,并使用条件

    中的那些
    boolean isLoggedIn = // some really long data base lookup
    boolean isGuest = // more data base stuff
    boolean guestCanEdit = // a complex boolean expression
    if (isLoggedIn || (isGuest && guestCanEdit)) { ...
    
  • 定义执行上述检查的三种方法,并使用if

    中的方法
    if (isLoggedIn(user) || (isGuest(user) && guestCanEdit(topic))) { ...
    

但请注意,第一个版本不使用短路,即所有条件都将被评估,即使第一个版本已经为真或第二个版本为假。如果计算上昂贵的任何条件或例如任何条件,应该避免这种情况。如果第三次检查只有在第二次检查成功时(例如在null检查后),

关于你的comment:条件

if (list.isEmpty() || 
        (!list.isEmpty() && list.getLast().compareTo(heap.peek().value) <= 0))

并不是 那么长,我不会为此提出任何上述方法,因为它不会那么短。但是可以缩短它,因为b部分是多余的。由于||的短路,(b && c)仅在!a时进行评估,并且由于您的b !a,您可以将其缩短为a || c

if (list.isEmpty() || list.getLast().compareTo(heap.peek().value) <= 0)

如果你的目标是计算调用compareTo的次数,你可以使用:

if (! list.isEmpty() && list.getLast().compareTo(heap.peek().value) <= 0)

现在这只是b && ca部分完全缺失。请注意,这等同于a || (b && c),但在这种情况下,这是一件好事,因为再次因为短路,compareTo实际上不会如果a || c已经评估为a,则会在true中调用

答案 2 :(得分:0)

是的,你可以这样做,但也许你不应该这样做。

if (a){ if (b){ statement; } }

完全等同于

if (a || b)

statement;也不能这样说:你需要在不止一个地方写if (a){ statement; } else if (b){ statement; }

||

即使有短路属性,&&if (a || b && c/*redundant parentheses removed*/){ statement; } 之间分发

所以

if ((a || b) && (a || c)){
    statement;
}

可以写成

if (a || b){
    if (a || c){
        statement;
    }
}

,从上面来看,是

{{1}}

虽然不必要地混淆了,但却是你想要的。

答案 3 :(得分:0)

对此的需求不是很清楚,但你可以这样做:在功能中实现:

function codeToDo() {
  // your code to execute on condition
}

if (a) {
  codeToDo();
else if (b) {
  if (c) {
    codeToDo();
  }
}

答案 4 :(得分:0)

if(a||b)

要进一步处理if(a){ /*do task1*/ }else if(b){ /*do task1*/ } 部分,请申请:

if(a)

请注意,在else if(b)以及<action name="mr-node"> <map-reduce> <job-tracker>${jobTracker}</job-tracker> <name-node>${nameNode}</name-node> <configuration> <property> <name>oozie.mapreduce.uber.jar</name> <value>${nameNode}/user/${wf:user()}/my-uber-jar.jar</value> </property> </configuration> </map-reduce> <ok to="end"/> <error to="fail"/> </action> 中,您运行相同的代码;即。任务1。