基于Scala中的可选属性筛选列表

基于Scala中的可选属性筛选列表,scala,Scala,假设我有下面的列表,其中Tuplesecondarg是可选的 List(Tuple("FullName", Some(1)), Tuple("FullName", None)) 获得以下结果的最干净方法是什么 List(Tuple("FullName", 1)) 我可以试试 list.filter(_._2.isDefined).map((_._1, _._2.get)) 我需要过滤掉第二个参数为None的所有元组,然后将元组类型更改为包含定义的整数,而不是选项 我想知道是否有一种更漂亮

假设我有下面的列表,其中
Tuple
secondarg是可选的

List(Tuple("FullName", Some(1)), Tuple("FullName", None))
获得以下结果的最干净方法是什么

List(Tuple("FullName", 1)) 
我可以试试

list.filter(_._2.isDefined).map((_._1, _._2.get))
我需要过滤掉第二个参数为
None
的所有元组,然后将元组类型更改为包含定义的
整数
,而不是
选项


我想知道是否有一种更漂亮的方法可以做到这一点?

是的,使用
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
允许您提供一个分部函数,该函数将保留分部函数中定义的任何值,并丢弃任何未定义的值

是,使用
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
允许您提供一个分部函数,该函数将保留分部函数中定义的任何值,并丢弃任何未定义的值

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

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

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

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

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

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