我正在尝试在Scala中找到一种使用Option [String]格式化String的简洁方法。我有一个标题字符串和一个副标题选项[字符串]。这就是我所拥有的,但我觉得必须有更好的方法:
"Title%s".format(subtitle match
{case Some(s) => ": %s".format(s)
case None => "" })
所以如果我有副标题,我想要“标题:副标题”,但如果副标题是None
,我只想要“标题”。
答案 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("", ": " + _)