Scala 如何在映射集合时忽略无值
我有以下代码:Scala 如何在映射集合时忽略无值,scala,Scala,我有以下代码: for { totalUsers = currentUsers.map { u => newUsersMap.get(u.username.get).map { t => FullUser(t.username, u.firstName, u.lastName, u.batch, t.description) } } } yield { totalUsers } 当我想要的是一个Seq[FullUser]时,这将返回一个Seq
for {
totalUsers = currentUsers.map { u =>
newUsersMap.get(u.username.get).map { t =>
FullUser(t.username, u.firstName, u.lastName, u.batch, t.description)
}
}
} yield {
totalUsers
}
当我想要的是一个Seq[FullUser]
时,这将返回一个Seq[Option[FullUser]]
——也就是说,如果调用u.username.get
没有返回任何值,那么就忽略它。如何实现这一点?考虑flatmapping
val totalUsers = currentUsers.flatMap { u =>
newUsersMap.get(u.username.get).map { t =>
FullUser(t.username, u.firstName, u.lastName, u.batch, t.description)
}
}
有关
Seq
、Option
和flatMap
如何协同工作的一些解释,请参见示例。请尝试理解
for {
user <- currentUsers
username <- user.username.toList //you need to convert to seq type to prevent ambiguous option seq mix problems.
t <- newUserMap.get(username).toList
} yield FullUser(t.username, u.firstName, u.lastName, u.batch, t.description)
用于{
用户如果u.username
是一个选项
可能是None
,我建议u.username.flatmap(newUsersMap.get).map{t=>…
@Kigyo这有什么不同?@cm22如果u.username
是一个选项
,并且没有任何价值(akanon/code>),调用u.username.get
将抛出一个异常。我的建议也考虑了这种情况。顺便说一下,通过映射混合理解和复杂转换有点反模式。