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

Java 将单行if语句拆分为多行if语句,java,Java,我试图将单行if语句拆分为具有相同含义的多行if语句。我有: if(a || (b && c)) { /* do smt */ } 但我想把它改成,如果我 if(a && b && c) { /*do smt*/ } 意思相同 if(a) { if(b) { if(c) { /* do smt */ } } } 谢谢 是的,你可以这样做,但也许你不应该这样做 i

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

 if(a || (b && c))
 {
    /* do smt */
 } 
但我想把它改成,如果我

if(a && b && c)
{
  /*do smt*/
}
意思相同

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

谢谢

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


if(a&b)语句

完全等同于

if (a){
    if (b){
        statement;    
    }
}
但是对于
if(a | | b)
,情况就不同了:您需要编写
语句位于多个位置:

if (a){
    statement;
} else if (b){
    statement;
}
也就是说,
|
确实分布在
&&
之间,即使具有短路特性:

所以

可以写成

if ((a || b) && (a || c)){
    statement;
}
从上面看,这是

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

虽然不必要地混淆了,但这正是您想要的。

这方面的需要不是很清楚,但您可以这样做:在函数中创建它:

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

if (a) {
  codeToDo();
else if (b) {
  if (c) {
    codeToDo();
  }
}
要进一步处理
if(a | | b)
零件,请应用:

if(a){
   /*do task1*/
}else if(b){
   /*do task1*/
}

请注意,在
if(a)
以及
else if(b)
中,您运行的是相同的代码;i、 任务1.

布尔代数可以改变这种情况

a | |(b&c)

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

所以你可以这样做:

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

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

你为什么要这么做?我的假设是
a
b
c
这三个条件非常长和/或复杂。如果是这种情况,我建议采取以下措施之一:

  • 声明三个具有描述性名称的布尔变量,并在条件中使用它们

    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 (list.isEmpty() || 
            (!list.isEmpty() && list.getLast().compareTo(heap.peek().value) <= 0))
    
  • 定义三种执行上述检查的方法,并使用
    if

    if (isLoggedIn(user) || (isGuest(user) && guestCanEdit(topic))) { ...
    
但是,请注意,第一个版本不使用短路,即将评估所有条件,即使第一个条件已为真或第二个条件为假。如果任何条件在计算上很昂贵,或者第三次检查只有在第二次检查成功(例如
null
检查后)才可能进行,则应避免这种情况


关于你的健康状况

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 (list.isEmpty() || 
        (!list.isEmpty() && list.getLast().compareTo(heap.peek().value) <= 0))

如果您的目标是计算调用
compareTo
的次数,则可以使用以下方法:

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

<代码> >(.List.IsVunTy.&&List.GETLAST[).COMPARETO(HEAP.PEEK())值。如果条件<代码> A<代码> B> < /COD>和<代码> C >代码>太长,请考虑用简短但描述性的名称编写方法,例如“代码> IF(ISLogGeDin(用户)”(ISCube(用户)& GuestCnEngEdEdress(主题))
你的问题是什么?我不明白。我会写一个问题的扩展版本来更清楚。因此if语句是
if(list.isEmpty()| |)(!list.isEmpty()&&list.getLast().compareTo(heap.peek().value)不要考虑你能做什么,而要考虑上下文。三重if非常难看,会降低代码的可读性。代码应该尽可能像一个口语句子一样阅读。我想这正是我想要的!谢谢!@henrich注意,现在你的第一个条件是
if(list.isEmpty()| |!list.isEmpty())
。对于您的特定情况,您根本不需要外部的
if
。处理两次对a的求值,如果a需要复杂的计算,则效果不是很好。如果a碰巧有副作用,则也是错误的。这是真的@tobias_k
if(list.isEmpty()| list.getLast().compareTo(heap.peek().value)两次处理a的计算,如果a需要复杂的计算,则效果不是很好。如果a碰巧有副作用,则也是错误的。
if (! list.isEmpty() && list.getLast().compareTo(heap.peek().value) <= 0)