Scala相当于C#中的`??`运算符

时间:2010-10-06 15:12:02

标签: c# scala

  

可能重复:
  How to write a proper null-safe coalescing operator in scala?

C#中的??运算符的Scala等价物是什么?

示例:

string result = value1 ?? value2 ?? value3 ?? String.Empty;

5 个答案:

答案 0 :(得分:10)

你可以用相同的语义编写自己的语义 - 这是由于从左到右的评估而坚持相同类型的语义,但是可以将其改为?:从右到左的评估会扩大根据需要输入类型:

class CoalesceNull[A <: AnyRef](a: A) { def ??(b: A) = if (a==null) b else a }
implicit def coalesce_anything[A <: AnyRef](a: A) = new CoalesceNull(a)

scala> (null:String) ?? (null:String) ?? "(default value)"
res0: String = (default value)

但是这个运算符不存在的原因可能是Option是处理这种情况的首选方式,以及处理不存在的值的许多类似情况:

scala> List((null:String),(null:String),"(default value)").flatMap(Option(_)).headOption
res72: Option[java.lang.String] = Some((default value))

(如果您确定至少有一个非空,则可以使用head;请注意,这可行,因为Option(null)会转换为NoneflatMap仅收集Some(_)个条目。)

答案 1 :(得分:4)

尝试getOrElse。我的朋友建议。

答案 2 :(得分:2)

我不相信有一个。您可以看到this发布空合并运算符的实现。

答案 3 :(得分:2)

请参阅链接的答案,但更重要的是,避免空值。使用选项。

答案 4 :(得分:1)

This blog post介绍了如何在Scala中实现Groovy的“Elvis运算符?:”。这与C#的??运算符完全相同。