2013-10-04 5 views
5

ScalaでOption [String]を使用してStringをフォーマットする簡潔な方法を見つけようとしています。私はタイトル文字列とサブタイトルOption [String]を持っています。ここで私が持っているものですが、良い方法がなければならないような気がします。私は字幕を持っている場合ScalaでOption [String]を使用してフォーマットする

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

だから、私は、「タイトル:サブタイトルを」したいが、字幕がNoneであれば、私は「タイトル」をしたいです。

+2

'subtitle.map( "タイトル:%s" の.format(_))。getOrElse( "タイトル")' –

+0

Tobiasと同様ですが、文字列補間を使用しています:字幕マップ(t => s "Title:$ t")getOrElse( "Title") –

答えて

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

正しい変数名を使用するか、またはそれはコンパイル時に失敗します何とかそれをmissuseていない場合ので、文字列の補間はformatよりも安全です。 formatは、プレースホルダまたはそのタイプの数がフォーマット引数と一致しない場合、実行時に失敗します。

ご使用のScalaのバージョンがこの機能をサポートし、有効になっている必要があります。

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

map方法はOptionタイプで使用することは非常に便利です。あなたは何か価値があると仮定して何をしたいかを言うことができ、それがNoneなら何が起こるか気にしません。最後に、後者が発生した場合の代替案を提供します(この場合は空のString "")。

1

あなたのアプローチより少しクリーナーですが、同じアイデアです。私はこれはかなり読みやすいと思う:あなたは、パターンオプションに一致しているが、より良い方法はおそらくあると思う場合

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

余談として、以下のリンクは素晴らしいリソースです:さて、あなたは可能性がScala Option Cheat sheet

+1

'subtitle'がNoneの場合は" Title: "を生成するので、その場合、OPは「タイトル」を望んでいた。 – siledh

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(_)) 
} 
を含んでいる私は、インポートユーティリティパッケージを持って少し冗長なことを見つけます

適用方法は私が書くことができるようになり、ここで重要なものです:

"Title" + subtitle("", ": " + _) 
関連する問題