当前位置: 首页 > 面试题库 >

Java是否有惰性评估?

蓟和煦
2023-03-14
问题内容

我知道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中的短路运算符视为惰性评估的一种非常有限的应用。

但是,当函数式语言强制执行惰性求值语义时,通常是出于完全不同的原因,即防止无限(至少是过度的)递归。



 类似资料:
  • 问题内容: 例如,如果我有以下语句: 如果foo1为true,python将检查foo2的条件吗? 问题答案: 是的,Python懒惰地评估布尔条件。 该文件说, 表达式x和y首先计算x;如果x为假,则返回其值;否则,将评估y并返回结果值。 表达式x或y首先计算x; 如果x为true,则返回其值;否则,将评估y并返回结果值。

  • 问题内容: 什么是Python中的惰性评估? 一个网站说: 在Python 3.x中,该函数返回一个特殊的范围对象,该对象按需计算列表元素(延迟或延迟评估): 这是什么意思? 问题答案: 由(或在Python2.x中)返回的对象被称为惰性迭代。 生成器没有将整个范围存储在内存中,而是存储的定义并仅在需要时才计算下一个值(又称惰性求值)。 本质上,生成器允许您返回类似于结构的列表,但是这里有一些区别

  • 我正在写一篇关于Java流API的文章。我已经阅读了Stream的整个软件包文档,并在这里查看了类似的问题。 如果我说:“直到终端操作被命中,才会评估流上的中间操作,这将实际执行它们,”我是否正确?我在StackOverflow上看到了混合答案,而且每个中间操作都返回一个Stream,所以我想知道它是否只是返回自己,然后只是跟踪要执行的中间操作。这就是“懒惰评估/执行”的意思吗? 下面的javad

  • 问题内容: 我正在尝试在Python3中使用。这是我正在使用的一些代码: 但是,由于在Python3中返回了迭代器,因此该代码在Python3中不起作用(但在Python2中可以正常工作,因为该版本的always返回a ) 我当前的解决方案是在迭代器上添加一个函数调用以强制求值。但这似乎很奇怪(我不在乎返回值,为什么要将迭代器转换为列表?) 有更好的解决方案吗? 问题答案: 当您对返回的值不感兴趣

  • 下面的备选案文1或备选案文2是否正确(例如,其中一个优于另一个),或者它们是否等同? 备选案文1 或 备选案文2

  • 问题内容: 我想知道JavaScript是否具有C#中的&&运算符之类的“短路”评估。如果没有,我想知道是否有一种合理的解决方法可以采用。 问题答案: 是的,JavaScript具有“短路”评估。