使用Scala中的Option [String]格式化

时间:2013-10-04 13:26:52

标签: scala

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

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

所以如果我有副标题,我想要“标题:副标题”,但如果副标题是None,我只想要“标题”。

4 个答案:

答案 0 :(得分:7)

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

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

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

答案 1 :(得分:5)

"Title%s".format(subtitle.map(": " + _).getOrElse(""))

map方法与Option类型一起使用非常方便。假设有一些值,你可以说你想做什么,如果没有,你不关心会发生什么。最后,如果后者发生(在我们的例子中是空字符串""),你只需提供一个替代方案。

答案 2 :(得分:1)

比你的方法更清洁,但同样的想法。我认为这很可读:

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

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

答案 3 :(得分: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("", ": " + _)