Java/Scala中的非短路逻辑(布尔)运算符有很好的用途吗?

sch*_*mmd 12 java scala

我最近发现,爪哇(和Scala)包括非短路逻辑运算符&,|^.我之前认为这些只能作为按位运算符.虽然可能存在争论^,但我不能想到使用非短路逻辑运算符的非常好的理由 - 尽管可以肯定,我可以设想一个例子.

这些运营商有用吗?它们似乎更容易导致难以捕获的错误.

scala> def foo = {
     |   println("foo")
     |   true
     | }
foo: Boolean

scala> def bar = {
     |   println("bar")
     |   true
     | }
bar: Boolean

scala> foo || bar
foo
res5: Boolean = true

scala> foo | bar
foo
bar
res6: Boolean = true
Run Code Online (Sandbox Code Playgroud)

dty*_*dty 16

如果右侧是具有您想要执行的副作用的函数(例如,日志记录),它们将非常有用.但是,我认为这有点代码味道,对下一个人来说肯定是不直观的.


Zan*_*ynx 8

嗯.我知道如果仔细使用它们对于优化C/C++代码非常有用.它也可能适用于Java.

C中的主要用途 - 除了实际的位操作 - 是删除管道停顿.短路操作器需要分支操作.按位运算符将计算双方并消除错误预测分支和结果停顿的机会.

  • 当我编写Guava的`com.google.common.math`时,当第二个条件特别快时,我的基准测试有时表明非短路操作员比短路操作员更快.(也就是说,如果我没有非常扎实,详细的基准,我就不会做出改变.) (5认同)