1

我一直在用稍微复杂的地图做一些工作,我需要解决的最后一个问题是替换Map()键为 a 的 aOption[Long]并将其替换为 a 的键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)
   }
4

1 回答 1

3

如果我理解正确,那么应该这样做。

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
于 2012-07-20T18:14:31.223 回答