转换Seq of Tuples的最短方法是什么,例如:
val xs : Seq[(Long,Option[Double])] = Seq((1L,None),(2L,Some(2.0)),(3L,None))
通过删除Nones 到Seq[(Long,Double)]
我用过两个
xs.filter(_._2.isDefined).map{case (i,x) => (i,x.get)}
和
xs.flatMap{
case (i,Some(x)) => Some(i,x)
case _ => None
}
但是想知道是否有更短的路。对于Seq[Option[Double]]
,我只会执行flatten
...但这对嵌套选项不起作用。
答案 0 :(得分:8)
您可以使用collect
来放弃不属于您案件的内容:
xs.collect{ case (i, Some(x)) => (i, x) }
在这种情况下,由于未使用case (i, None)
,因此这些案例将被过滤掉。
答案 1 :(得分:1)
怎么样:
val x: Seq[(Long, Option[Double])]
x.map {
case (a, b) => b.map(z => (a, z))
} flatten
答案 2 :(得分:1)
取决于您称之为可接受的内容。几个选项:
xs.collect(Function.unlift(e => e._2.map(e._1 -> _)))
xs.map(e => e._2.map(e._1 ->)).flatten
虽然我们正在进入代码高尔夫领域,但它们更短。