有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java为什么不提供一个操作符在斯卡拉

Java中有一个运算符? :,可用于根据布尔表达式选择值。例如,表达式3 > 2 ? "true" : false将返回字符串"true"。我知道我们可以使用if表达式来实现这一点,但我更喜欢这种风格,因为它简洁优雅


共 (3) 个答案

  1. # 1 楼答案

    为了补充@Jesper所说的内容,如果您发现if-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
    
  2. # 2 楼答案

    按重要性的大致顺序:

    1):符号保留用于类型注释

    2)在Scala中,符号可以用作方法名和值名的标识符。标准键盘上可用的运算符数量有限,因此,如果您决定将其中两个用作关键字,则会减少可使用的运算符池(请参见脚注了解为什么必须用作关键字)

    3)正如杰斯珀所说,更强大的if/else已经发挥了这一作用,因此收益微乎其微

    4)Scala还具有模式匹配功能,它以更一般的方式与match关键字起到类似的作用。例如,如果表达式的计算结果不是布尔值,该怎么办

    5)这将增加额外的编译器复杂性。与特殊情况相比,Scala更喜欢简单性和一致性

    6)这是C语言的遗留问题,也是一种非常奇怪的语法。Scala有足够多奇怪的语法


    脚注: 虽然可以提出一个合理的方案来模拟? :作为方法(参见Ternary operator typing),但它不如关键字那样可行。当“true”和“false”选项的数字类型不同时,正确处理键入是很复杂的,operator precedence是一个问题,因为您需要的运算符优先级比其他运算符低(或者必须使用括号),并且由于实现的运行时性质,性能可能会受到影响

  3. # 3 楼答案

    在Java中,if? :之间有一个区别,即if语句,而? :表达式。在Scala中,if也是一个表达式:它返回一个值,例如,您可以将该值分配给变量

    Scala中的if比Java中的if更像Java中的? :

    // 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完全相同,但使用了替代的(更模糊的)语法