2016-06-14 14 views
0

私は結果の中にOptionオブジェクトの代わりに実際の値を持っています。結果からオプションを削除

case class MyObj(id: String, objVal: List[String]) 

val listOfListOfIds = List(List(id1, id2, id3), List(id4, id5, id6)) 

val allMyObjs = List(
    MyObj("id1",List("val1a", "val1b")), 
    MyObj("id2",List("val2a", "val2b")), 
    MyObj("id3",List("val3a", "val3b")), 
    MyObj("id4",List("val4a", "val4b")), 
    MyObj("id5",List("val5a", "val5b")), 
    MyObj("id6",List("val6a", "val6b")) 
) 

listOfListOfIds.map { _.map { id => allMyObjs.find(obj => obj.id == id).map { _.objVal map { v => Future(v) } } } } 

戻りList[List[Option[List[scala.concurrent.Future[String]]]]]、どのように代わりList[List[List[scala.concurrent.Future[String]]]]を取得するには?

+1

あなたは 'オプション[一覧[T]]' '空の可能性のリストに[T]' '' opt.getOrElse(List.empty [T])を呼び出しを有効にすることができます。このコードは、より明示的な型を持つためにケースクラスを使用することで利益を得ます。 – cchantep

+0

これは実際のコードですか?私は2つのコレクション間の交差をしたい場合、なぜ 'HashSet'を使わないのでしょうか?また、リストのリストをフラット化できますか? –

+0

少なくとも、中間の不変変数の使用をお勧めします。 List [List [List [List [List [List [list]] [] []]型は理解できないと考えています。 –

答えて

1

私の代わりにマップのflatMapを使用したい:

val res = listOfListOfIds.map { 
    _.flatMap { id => allMyObjs.find(obj => obj.id == id).map { _.objVal map { v => Future(v) } } } 
} 
+0

はい、それで、次の質問は、List [List [List [Lista [scala.concurrent.Future [String]]]]の代わりにList [scala.concurrent.Future [String]]を取得するためにすべてを平坦化する方法です。 List [List [scala.concurrent.Future [String]]] – jerome

+1

これは、最初のマップの代わりに同じ原理のflatMapであり、最後に平坦化されます – eliasah

1

代替ソリューションがあります。オプションのソースは、あなたがリストに適用するのfind()メソッドである:発見以来

allMyObjs.find(obj => obj.id == id) 

()、あるいはないかもしれないが、あなたが探しているものを見つけることがあり、それはオプションを返すことがあります。代わりに、引数として渡す述語に準拠していない項目を破棄し、そうでない項目だけを返すfilter()を使用する方法があります。あなたの代わりに以下のコードを使用している場合、結果は値そのものとリストになります。

> listOfListOfIds.flatMap { _.flatMap { id => allMyObjs.filter(obj => obj.id == id).flatMap {_.objVal map { v => Future (v) } } } } 
res0: List[scala.concurrent.Future[String]] = List(Success(val1a), Success(val1b), Success(val2a), Success(val2b), Success(val3a), Success(val3b), Success(val4a), Success(val4b), Success(val5a), Success(val5b), Success(val6a), Success(val6b)) 

で平らにして、あなたは組み合わせの代わりにマップのflatMapを()()、使用することができます仲介のリストを除去するとあなたが好きなように終わります。

乾杯

関連する問題