根据Scala中的Optional属性筛选列表

时间:2016-09-23 12:50:01

标签: scala

想象一下,我有以下列表,其中Tuple第二个arg是可选的

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

获得以下结果的最简洁方法是什么?

List(Tuple("FullName", 1)) 

我可以试试

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

我需要过滤掉第二个参数为None的所有元组,然后将元组类型更改为包含已定义的integer而不是option

我想知道是否有更漂亮的方法吗?

2 个答案:

答案 0 :(得分: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允许您提供一个部分函数,​​该函数将保留在partial函数中定义的任何值,并丢弃任何不在的部分函数。

答案 1 :(得分:0)

另一种不使用get()的可能性可能是

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

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