为什么不提供运营商? :在scala中
有一个运营商? :
? :
在Java中,可用于根据布尔表达式选择值。 例如,表达式3 > 2 ? "true" : false
3 > 2 ? "true" : false
将返回一个字符串"true"
。 我知道我们可以使用if
表达式来做到这一点,但我更喜欢这种风格,因为它简洁而优雅。
在Java中, if
和? :
之间存在差异? :
? :
那就是说, if
是一个陈述 ? :
? :
是一个表达 。 在Scala中, if
也是一个表达式 :它返回一个值,您可以将其分配给变量。
Scala中的if
更像是? :
? :
在Java中比在Java中的if
:
// In Scala 'if' returns a value that can be assigned to a variable val result = if (3 > 2) "yes" else "no"
你不能用Java做到这一点:
// Illegal in Java, because 'if' is a statement, not an expression String result = if (3 > 2) "yes" else "no"
那么,真的没有必要? :
? :
在Scala中,因为它与if
完全相同,但使用替代(更加模糊)的语法。
要添加@Jesper所说的内容,如果你发现 – else
太冗长,Scalaz提供了两个更多的替代方案:三元布尔运算符( ?
, |
),类似C语言和fold
函数。
scala> import scalaz._ import scalaz._ scala> import Scalaz._ import Scalaz._ scala> (3 > 2) ? "True" | "False" res59: java.lang.String = True scala> (3 > 2).fold("True", "False") res60: java.lang.String = True
按重要性排序:
1) :
符号保留用于类型注释
2)在Scala中,符号可以用作方法和值名称的标识符。 标准键盘上只有有限数量的这些可用,因此如果您决定将其中两个放入关键字中,那么您将减少可以使用的运算符池(请参阅脚注,了解为什么它们必须是关键字)
3)正如Jesper所说,更强大的if
/ else
已经完成了这个角色,所以收益是微不足道的
4)Scala还具有模式匹配,其以更一般的方式与match
关键字一起履行类似的角色。 例如,如果你的表达式求值为不是布尔值的东西怎么办?
5)它会增加额外的编译器复杂性。 Scala更喜欢简单和统一的特殊情况
6)这是C的宿醉,实际上是一种奇怪的语法。 Scala有足够奇怪的语法
脚注:虽然有可能提出一个合理的模拟方案? :
? :
作为方法(参见三元运算符输入 ),它不像关键字那样可行。 当“true”和“false”替代品具有不同的数字类型时,处理正确的输入很复杂, 运算符优先级是一个问题,因为您需要优先级低于其他任何操作符的运算符(或者您必须使用括号),以及由于实现的运行时性质,性能可能会受到影响。
- Guava MultiMap和ConcurrentModificationException
- 一段时间后,随着ProcessBuilder阻止了Java应用程序
- 是否有任何方法可以让IntelliJ IDEA在Java项目中识别Dagger 2生成的类?
- 使用jsch将远程服务器中的目录移动到同一远程服务器中的另一个位置
- XStream短动态别名
- Google Apps Admin API:需要为服务帐户指定帐户用户吗?
- 使用Java访问其他类文件
- java.util.Collections.sort()方法的时间复杂度是多少?
- Spring Data JPA – 在没有@Transactional的情况下获取了Lazy Loaded集合