简洁的方法来过滤和映射包含选项的元组的scala序列

时间:2018-03-29 13:39:57

标签: scala

转换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 ...但这对嵌套选项不起作用。

3 个答案:

答案 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)

取决于您称之为可接受的内容。几个选项:

  1. xs.collect(Function.unlift(e => e._2.map(e._1 -> _)))
  2. xs.map(e => e._2.map(e._1 ->)).flatten
  3. 虽然我们正在进入代码高尔夫领域,但它们更短。