在Java中,如果我在常规if中使用三元if运算符,例如:
if ((x > y - z) ? true : callLongWaitedMethod(many, parameteres)) {
loveTeddyBear();
}
如果x > y - z
确实是真的,它会执行callLongWaitedMethod吗?我希望它不是,我可以使用这个漂亮的声明,乍一看稍微复杂,但与额外的布尔变量比较更有吸引力:
boolean b = (x > y - z) ? true : callLongWaitedMethod(many, parameteres);
if (b) {
loveTeddyBear();
}
特别是如果我在一个反复遍历的大循环中使用它,那么从性能的角度来看每次创建布尔值都不会很好,而如果我在循环外声明布尔值,我可能会错过整齐因为循环的大小。
答案 0 :(得分:6)
这将按照您的希望工作,但只需使用普通的||
运算符来完成相同的结果就更清楚了:
if ((x > y - z) || callLongWaitedMethod(many, parameteres)) {
loveTeddyBear();
}
答案 1 :(得分:3)
根据Java Language Specification 15.25,只有在必要时才会评估长方法:
未针对条件表达式的特定评估评估未选择的操作数表达式。
答案 2 :(得分:2)
callLongWaitedMethod
为真, x > y - z
将被调用。
答案 3 :(得分:0)
如果你想在callLongWaitedMethod
为真时执行(x > y - z)
,你实际上必须交换表达式:
if ((x > y - z) ? callLongWaitedMethod(many, parameteres) : true ) {
loveTeddyBear();
}
答案 4 :(得分:0)
好像你有你想要的答案。您也可以将调试语句与简单版本的代码一起使用,以查看作为验证行为的方式执行的操作。像
这样的东西if ((1 > 2) ? true : someSimpleMethod()) {
System.out.println("true if");
}
正如您的someSimpleMethod()
有
public boolean someSimpleMethod() {
System.out.println("calling someSimpleMethod()");
return true;
}
从那里你可以交换1和2来查看someSimpleMethod()
是否会执行。
答案 5 :(得分:0)
你应该问自己是编码员,如果你不知道它会做什么,你真的应该这样编码吗?为什么不呢:
if ( (x>y-z) ||
(x<=y-z && callLongWaitedMethod(many, parameteres))) {
loveTeddyBear();
}
对于不熟悉代码的新手程序员来说,这会更有意义。