2012-03-05 14 views
8

私は関数を定義します:xSome(str)で、strトリミング後に空になるとSome( "")をNoneに変換するにはどうすればいいですか?

def convert(x: Option[String]): Option[String] = ... 

は、それ以外の場合はトリミングされた文字列とSomeなり、Noneに変換されます。

ので、テストケースは次のようになります。

convert(Some("")) == None 
convert(Some(" ")) == None 
convert(None) == None 
convert(Some(" abc ")) == Some("abc") 

私はそれを書くことができます。

def convert(x: Option[String]): Option[String] = x match { 
    case Some(str) if str.trim()!="" => Some(str.trim()) 
    case _ => None 
} 

しかし、私は単純な実装(1行)を見つけることを願っています。

+3

環境内に改行文字が不足していますか?あなたはあなたが書いた行の数に反比例して支払いを受けるのですか? – paxdiablo

+1

私はちょうど私のコードをシンプルでクリアなものにしたいと思っています。 – Freewind

+1

@paxdiablo:実際に改善することができるので、有効な質問です。コード'str.trim'を2回実行します。これは明らかに避けるべきことです。 – Debilski

答えて

15

これについて何:

def convert(x: Option[String]) = 
    x.map(_.trim()).filterNot(_.isEmpty()) 

UPDATE:@JamesMoore@PeterSchmitzによって提案された代替構文:

x map {_.trim} filterNot {_.isEmpty} 
x map (_.trim) filterNot (_.isEmpty) 
+0

申し訳ありません、 'convert(Some(" abc "))!= Some(" abc ")' – Freewind

+0

@Freewind:私の謝罪は今正しいはずです。 –

+4

私はあなたが括弧を削除すると読むのが簡単だと思います:x map {\ _。trim} filterNot {\ _。isEmpty} –

1

そして、いつものように理解のための代替構文は(もありますこれはフィルタとマップのシンタックスシュガーです)

def convert(o: Option[String]): Option[String] = 
    for (x <- o if !x.isEmpty) yield x 
+1

構文ビネガー –

1

def convert(x:Option [String])= x.filter(s => s.trim.nonEmpty)

関連する問題