可能重复:
How to write a proper null-safe coalescing operator in scala?
C#中的??
运算符的Scala等价物是什么?
示例:
string result = value1 ?? value2 ?? value3 ?? String.Empty;
答案 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)
会转换为None
和flatMap
仅收集Some(_)
个条目。)
答案 1 :(得分:4)
尝试getOrElse。我的朋友建议。
答案 2 :(得分:2)
我不相信有一个。您可以看到this发布空合并运算符的实现。
答案 3 :(得分:2)
请参阅链接的答案,但更重要的是,避免空值。使用选项。
答案 4 :(得分:1)
This blog post介绍了如何在Scala中实现Groovy的“Elvis运算符?:
”。这与C#的??
运算符完全相同。