Scala:从一个值为None的Seq中删除元组的最佳方法

我希望过滤出None值,它们出现在元组的Seq中。 在下面的代码中,我想将getOrElse替换为get。但是,如何删除第一个值为None的元组呢?

这是我的代码。我觉得这很不雅。

myFirstMap.map {
  case (key,value) =>
    val tuple = (myLookUpMap.getOrElse(key,MyCaseclass("",None)),value.toString)
    tuple
}.filter(_._1.name.nonEmpty).toIndexedSeq

}

正确的方法是什么?

注意:此方法将在长度为40到100的Seq上被调用数千次,因此性能很重要

guoqia 回答:Scala:从一个值为None的Seq中删除元组的最佳方法

.map().flatMap()应该可以解决问题,这正是for理解的全部内容。

(for {
  (k,v) <- myFirstMap
  mcc    <- myLookUpMap.get(k)
} yield (mcc,v.toString)).toIndexedSeq
,

myFirstMap.collect { case (k,_) if myFilterMap.contains(k) => myFilterMap(k)}

,

也许

myFirstMap.map {
  case (key,value) =>
    myLookUpMap.get(key).map( found => Tuple2( found,value.toString ) )
}.withFilter(_.nonEmpty).map( _.get ).toIndexedSeq

...或更可读...

val mbTuples = myFirstMap.map {
  case (key,value.toString ) )
}
val foundTuples = mbTuples.withFilter(_.nonEmpty).map( _.get )
val tupleSeq = foundTuples.toIndexedSeq
,

或者这种方法怎么样:

val commonKeys = myFirstMap.keySet().intersect( myLookUpMap.keySet() )
val tupleSeq = commonKeys.map { case ( key,value ) =>
  ( myLookUpMap(key),value.toString )
}.toIndexedSeq
,

您可以使用flatMap过滤集合中的所有内容

myFirstMap.flatMap { case (key,value) => myLookUpMap.get(key).map(entity => (entity,value.toString)) }

本文链接:https://www.f2er.com/3154571.html

大家都在问