我一直在用稍微复杂的映射做一些工作,我需要解决的最后一个问题是替换密钥为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