Java是否有惰性评估?
我知道Java在这种情况下具有智能/惰性评估:
public boolean isTrue() { boolean a = false;
boolean b = true;
return b || (a && b); // (a && b) is not evaluated since b is true
}
但是关于:
public boolean isTrue() { boolean a = isATrue();
boolean b = isBTrue();
return b || a;
}
isATrue()
即使isBTrue()
返回true 也被调用?
回答:
在Java(和其他类似C的语言)中,这称为 短路评估 。*
是的,在第二个示例isATrue
中总是被调用。也就是说,除非编译器/
JVM可以确定它没有可观察到的副作用,否则在这种情况下它可以选择进行优化,但是无论如何您都不会注意到它们之间的差异。
两者截然不同; 前者本质上是一种优化技术,而第二种则是该语言所强制要求的,并且会影响可观察的程序行为。
我最初建议这与惰性评估完全不同,但是正如@Ingo在下面的评论中指出的那样,这是一个可疑的断言。有人可能会将Java中的短路运算符视为惰性评估的一种非常有限的应用。
但是,当函数式语言强制执行惰性求值语义时,通常是出于完全不同的原因,即防止无限(至少是过度的)递归。
以上是 Java是否有惰性评估? 的全部内容, 来源链接: utcz.com/qa/407045.html