为什么 'condition && statement()' 在 Java 世界不流行?

Why 'condition && statement()' is not popular in Java world?

在 Java 脚本世界中(尤其是在 React 应用程序中)我见过像 [2] 这样的表达式。然而,在 Java 这不是很流行。

1.

if(isValid) {
   statement();
}
isValid && statement();

[1] 和 [2] 的结果相同,因为 statement() 不会被评估 if isValid == false

编辑:

我在 Groovy 控制台中对此进行了测试。我想这使这个问题非常无效。无论如何感谢您的回复。

if( isValid && statement() ) 仅在 statement() return 为 boolean 时有效,否则条件将无法编译。这样做 可能 不被认为是好的设计(取决于 statement 实际做了什么)并且可能会降低可读性或您使用 return 值 [=11] 的能力=].

除此之外 just isValid && statement(); 不受语言支持 - 不要错误地将 Java 之类的语言与其他语言进行比较JavaScript 之类的语言,它们遵循不同的范例。

可以 做类似 boolean b = isValid && statement(); 的事情,但通常只有当你想以某种方式使用 b 的值时才会这样做。

编辑: 根据KRyan的要求,我还将添加一段关于a && b的含义及其在[=中的用途87=] 以及 JavaScript(虽然我不是这里的专家)。

Java

通常,您可以使用 &(和)或 |(或)组合两个布尔表达式。因此 true & true 将导致 truetrue | false 一样,但 true & false 将导致 false

单字符运算符的问题在于,即使您已经知道结果,每个 参数都会被计算。例如,当您看到 false & ... 时,您已经知道在查看第一个参数时结果是 false,任何其他参数都不会产生影响。

现在,如果您有一个表达式调用某些方法,其中 return 一个布尔值,您可能不想执行那些不需要的方法,例如当方法本身非常昂贵时。例如考虑 needsCheckWebsite & isValueOnWebsite( "test" )isValueOnWebsite( "test" ) 可能需要一段时间,如果 needsCheckWebsite 为假,您不想执行该方法。

要解决这个问题,您可以使用双字符运算符 &&||,也就是短路运算符。这意味着如果你写 needsCheckWebsite && isValueOnWebsite( "test" ) 并且如果 needsCheckWebsite 为假,那么 isValueOnWebsite( "test" ) 的昂贵执行将不会发生,因为我们已经知道结果不会改变任何事情。

因此 isValid && statement() 意味着 statement() 应该只在 isValid.

时执行

Java脚本

AFAIK 在 JavaScript 中,短路运算符以类似的方式工作,因为它评估第一个参数,如果结果仍然未知,则评估第二个参数并 returned。但是,由于 JavaScript 是一种动态类型的语言(与静态类型的 Java 相比),您可以混合使用不同的类型,例如var value = null || "hello" 这将导致 value = "hello".

这允许开发人员将 &&|| 用于布尔逻辑以外的事情,例如提供默认值,由于静态类型,这在 Java 中是不可能的(在 Java 中,您可以为此使用三元运算符 ?,例如 String s = input != null ? input : defaultValue 但如您所见,它看起来不像 JavaScript 的 var s = input || defaultValue).

它们不可互换:

isValid && statement(); 是一个 表达式 不是 一个 语句 。此外,它仅在您的 statement() 方法的类型为 boolean 时才有效。

所以你只能在 Java 语言语法需要(谓词)表达式的地方使用它。

意见:如果满足以上要求你就用它,那我确实觉得"Does decrease readability"。 (因为它只能在某些情况下使用,加上你自己的话("doing Java development for an almost decade now and I've never seen")没人期望它)

如上一个答案中所述,`isValid && statement();是一个表达式,需要存储在一些我们不能直接使用的变量中。但是对于语句不是。

使用表达式又占用了一个堆space。