我試圖找到一種簡潔的方式來格式化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(「標題」) –