如何组合两组数据

时间:2014-08-25 23:45:21

标签: scala

我有一个User对象列表,每个User对象都是这样的:

case class User(username: String, firstName: String, lastName: String, batchId: Int, imageUrl: String)

我希望浏览该列表,提取所有用户名,并将这些用户名发送到API,该API将返回包含Twitter特定信息(例如个人资料信息和推特个人资料图片)的JSON列表。然后,我想获取返回对象的列表,并将每个对象中的信息添加到我的原始对象列表中,并按用户名进行匹配。

我怎样才能以功能的方式做到这一点?

1 个答案:

答案 0 :(得分:1)

你这么做就像你说的那样。我假设您可以弄清楚如何与API取得联系并获得JSON,以及如何使其成功运行"部分是问题的核心。

如果您要批量查询,而您可能无法获得所请求的用户名,则可以执行以下操作:

val usernames = allUsers.map(_.username)
val json = myGetJSONRoutine(usernames)
val parsed = makeMapFromJSON(json)   // Returns Map[String, TwitterInfo]
val newUsers = allUsers.map{ x =>
  parsed.get(x.username).map{ t => 
     // Generate the updated user object here
     x.copy(imageUrl = t.imageUrl)
  }.getOrElse(x)  // Fall back to pre-existing object
}

无论如何,基本步骤是:映射用户名,获取JSON,将其解析为从用户名到您需要的任何新信息的地图,然后映射用户记录,用新信息更新它们。然后,您停止使用allUsers并开始使用newUsers

这真的是整个诀窍:不是更新现有记录,而是使用基于旧记录的新记录重新生成列表(copy是为此类更新而构建的。)

如果您的用户记录在获得推特信息后需要有所不同(也就是说,原始对象不仅包含数据的存根),那么您还需要编写一个来自未经推文的{{1}的默认映射器到User类。或者,您的UserWithTwitter可能有一个User字段twittery,如果您确实找到该信息,则开始设置为Option[TwitterInfo],然后设置为None

使用Web API获取JSON,然后解析JSON的完整教程超出了一个问题的范围。 (但是,例如Play可以做到。)