我试图找到一种简洁的方式来格式化Scala中的选项[字符串]的字符串。我有一个标题字符串和一个字幕选项[字符串]。下面是我,但我觉得必须有一个更好的办法:使用Scala中的选项[字符串]格式化
"Title%s".format(subtitle match
{case Some(s) => ": %s".format(s)
case None => "" })
所以,如果我有一个字幕,我想“标题:副标题”,但如果字幕是None
,我只是想“标题” 。
我试图找到一种简洁的方式来格式化Scala中的选项[字符串]的字符串。我有一个标题字符串和一个字幕选项[字符串]。下面是我,但我觉得必须有一个更好的办法:使用Scala中的选项[字符串]格式化
"Title%s".format(subtitle match
{case Some(s) => ": %s".format(s)
case None => "" })
所以,如果我有一个字幕,我想“标题:副标题”,但如果字幕是None
,我只是想“标题” 。
subtitle map (t => s"Title: $t") getOrElse ("Title")
字符串插值比format
更安全,因为如果你不使用正确的变量名,或missuse它在某种程度上它会在编译时失败。如果占位符或其类型的数目与格式参数不匹配,则format
将在运行时失败。
您的Scala版本必须支持此功能并启用它。
"Title%s".format(subtitle.map(": " + _).getOrElse(""))
map
方法与Option
类型使用起来非常方便。你可以说出你想要做什么,假设有一些价值,并且不关心如果它没有,会发生什么。最后,如果后者发生,你可以提供一个替代方案(在我们的例子中为空字符串""
)。
比你的方法更清洁一点,但是有同样的想法。我认为这是相当可读:
"Title: %s" format subtitle.getOrElse("")
顺便说一句,下面的链接是一个很好的资源,如果你是模式上的一个选项匹配,但觉得可能有一个更好的方法:Scala Option Cheat sheet
这将不起作用,因为如果'subtitle'为None,将产生“标题:而OP在这种情况下需要“标题”。 – siledh
那么你可以使用方法:
"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(_))
}
的申请方法是这里最重要的一个,这将允许我这样写:
"Title" + subtitle("", ": " + _)
'subtitle.map( “标题:%S” .format(_))getOrElse( “标题”)' –
。像托比亚斯说的,但带有字符串插值:字幕映射(t => s“标题:$ t”)getOrElse(“标题”) –