我有一个User对象列表,每个User对象都是这样的:
case class User(username: String, firstName: String, lastName: String, batchId: Int, imageUrl: String)
我希望浏览该列表,提取所有用户名,并将这些用户名发送到API,该API将返回包含Twitter特定信息(例如个人资料信息和推特个人资料图片)的JSON列表。然后,我想获取返回对象的列表,并将每个对象中的信息添加到我的原始对象列表中,并按用户名进行匹配。
我怎样才能以功能的方式做到这一点?
答案 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可以做到。)