Scala 从Option case类中提取选项时如何指定默认值

Scala 从Option case类中提取选项时如何指定默认值,scala,Scala,如果我将案例类定义为: case class Foo(bar: Option[String]) 还有一个变量baz:Option[Foo],从baz中提取bar的最惯用方法是什么,同时提供一个空字符串之类的默认值 现在,我有 baz.fold("")(_.bar.getOrElse("")) 但是有两次空字符串在那里让我觉得有更好的方法。怎么样: baz.flatMap(_.bar).getOrElse("") 或根据@vptheron的评论: baz.flatMap(_.bar).fol

如果我将案例类定义为:

case class Foo(bar: Option[String])
还有一个变量
baz:Option[Foo]
,从
baz
中提取
bar
的最惯用方法是什么,同时提供一个空字符串之类的默认值

现在,我有

baz.fold("")(_.bar.getOrElse(""))
但是有两次空字符串在那里让我觉得有更好的方法。

怎么样:

baz.flatMap(_.bar).getOrElse("")
或根据@vptheron的评论:

baz.flatMap(_.bar).fold("")(identity)
那么:

baz.flatMap(_.bar).getOrElse("")
或根据@vptheron的评论:

baz.flatMap(_.bar).fold("")(identity)

不要使用
getOrElse
。有关更多详细信息,请参见我对上一个问题的回答:我实际上从未注意到
getOrElse
没有强制您使用
选项中的相同类型。为什么这样设计?这是由于
选项[+A]
中类型参数A的协方差造成的。关于这一点,有很多参考资料可以阅读,例如:不要使用
getOrElse
。有关更多详细信息,请参见我对上一个问题的回答:我实际上从未注意到
getOrElse
没有强制您使用
选项中的相同类型。为什么这样设计?这是由于
选项[+A]
中类型参数A的协方差造成的。关于这一点,有很多参考资料可以阅读,例如:
x=>x
已经在
Predef
中定义了
identity
@vptheron对
getOrElse
的评论,但实际上我更喜欢第一种解决方案,因为我认为它的意图更明确。
x=>x
已经在
Predef
中定义为
identity
@vptheron对
getOrElse
的评论被很好地采纳了,但实际上我更喜欢第一种解决方案,因为我认为它的意图更明确。