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
的评论被很好地采纳了,但实际上我更喜欢第一种解决方案,因为我认为它的意图更明确。