如何映射集合时如何忽略无值

时间:2014-08-26 01:56:01

标签: 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[Option[FullUser]]时,这将返回Seq[FullUser] - 即如果对u.username.get的调用返回None,则忽略它。我该怎么做?

2 个答案:

答案 0 :(得分:5)

考虑平面图。

val totalUsers = currentUsers.flatMap { u =>
  newUsersMap.get(u.username.get).map { t =>
    FullUser(t.username, u.firstName, u.lastName, u.batch, t.description)
  }
}

有关SeqOptionflatMap如何协同工作的一些说明,请参阅示例this blog post

答案 1 :(得分:4)

试着理解

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)
flatMapmap混合的

无法读取。