2016-09-23 9 views
0

にオプションのプロパティに基づいてリストをフィルタリングすることは、私はTuple第二引数はオプションScalaの

List(Tuple("FullName", Some(1)), Tuple("FullName", None)) 

次のような結果を得るためにクリーンなアプローチは何ですか?です。以下のリストを持っている想像してみて

List(Tuple("FullName", 1)) 

私は2番目の引数はNoneここですべてのタプルをフィルタリングして、定義されintegerなくoptionを含むようにタプル型を変更する必要が

list.filter(_._2.isDefined).map((_._1, _._2.get)) 

を試みることができます。

これを行うにはもっときれいな方法がありますか?

答えて

4

はい、collectとパターンマッチングを使用してください。

val list = List(("FullName", Some(1)), ("FullName", None)) 

scala> list collect { case (name, Some(i)) => (name, i) } 
res0: List[(String, Int)] = List((FullName,1)) 

collectあなたは部分関数内で定義されている任意の値を保持し、されないこといずれかを破棄します一部の機能を提供することができます。

0

get()を使用していない別の可能性はあるかもしれない

val list = List(("FullName", Some(1)), ("FullName", None)) 

list.filter(_._2.isDefined).unzip match { 
    case (k, v) => k zip v.flatten 
}