Scala:用对象替换映射中的键



我一直在用稍微复杂的映射做一些工作,我需要解决的最后一个问题是替换密钥为Option[Long]Map(),并将其替换为Option[User]的密钥。

地图看起来像:

(Map[ Option[Long], List[Tuple3[Job,Option[Client],Option[Project]]] ]()

我有一份Option[User]的清单。我原以为foldLeft可以做到这一点,但由于我的业余爱好,语法很棘手。我尝试了以下操作,但没有成功:

theMap.foldLeft(users){
      (u,j) => 
        if(j._1!=None) {
          Map(u, j._2)
        } else {
          Map(User.placeholder, j._2)
        }
    }.flatten

下面的编译器错误表明我可能没有将变量放在正确的位置。

type mismatch; found : List[Option[models.User]] required: (?, ?)

如何才能恰当地做到这一点?

编辑:已实现我还需要将第一个Long密钥与user.id匹配。如果我弄清楚了,我会更新它。

越来越近,只需切换到映射。但这有点麻烦:

allJobs.map{
     case ((i,l)) =>
       val user = users.map{ user =>
         if(user.map(_.id)==i) user
       }
       Tuple2(user.head, l)
   }

如果我理解正确,那么这应该可以做到。

val userMap = users map {u => (u, theMap(u map {_.id})} toMap

我不确定Option密钥在这里有多有用,因为只能有一个None密钥,但如果你需要说明该密钥,而它可能不在users列表中,那么你可以单独添加它。

val newMap = if(theMap contains None) userMap + (User.placeholder, theMap(None)) 
             else userMap

相关内容

  • 没有找到相关文章