6

我正在尝试找到一种简洁的方法来在 Scala 中使用 Option[String] 格式化字符串。我有一个标题字符串和一个副标题选项 [字符串]。这就是我所拥有的,但我觉得必须有更好的方法:

"Title%s".format(subtitle match
    {case Some(s) => ": %s".format(s)
     case None    => "" })

所以如果我有一个字幕,我想要“Title: Subtitle”,但如果 subtitle 是None,我只想要“Title”。

4

4 回答 4

7
 subtitle map (t => s"Title: $t") getOrElse ("Title") 

字符串插值比format因为如果你不使用正确的变量名,或者以某种方式误用它会在编译时失败,更安全。format如果占位符的数量或其类型与格式参数不匹配,则会在运行时失败。

您的 Scala 版本必须支持此功能并启用它。

于 2013-10-04T13:48:04.913 回答
5
"Title%s".format(subtitle.map(": " + _).getOrElse(""))

mapOption方法与类型一起使用非常方便。假设存在一些价值,您可以说出您想要做什么,并且不在乎如果它是 None 会发生什么。最后,如果后者发生(在我们的例子中为空 String ""),您只需提供一个替代方案。

于 2013-10-04T13:35:06.110 回答
1

比您的方法更清洁,但想法相同。我认为这是非常可读的:

"Title: %s" format subtitle.getOrElse("")

顺便说一句,如果您在 Option 上进行模式匹配但认为可能有更好的方法,以下链接是一个很好的资源:Scala Option Cheat sheet

于 2013-10-04T18:59:42.627 回答
0

那么你可以使用:

"Title" + subtitle.fold("")(": " + _)

但就我个人而言,我仍然觉得这有点冗长,所以我有一个我导入的实用程序包,其中包括

implicit class OptionRichClass[A](n: Option[A])
{     
  def apply[T](valNone: T, fSome: A => T): T = n.fold(valNone)(s => fSome(s))
  def mapList[T](f: (A) => T): List[T] = n.map[T](f(_)).toList      
  def flatList[T](f:(A) => List[T]): List[T] = n.fold(List[T]())(f(_))
  def flatSeq[T](f:(A) => Seq[T]): Seq[T] = n.fold(Seq[T]())(f(_))
}

apply 方法在这里很重要,它允许我写:

"Title" + subtitle("", ": " + _)
于 2013-10-05T16:29:39.447 回答