Scala 如何组合两组数据

Scala 如何组合两组数据,scala,Scala,我有一个用户对象列表,每个用户对象如下所示: case class User(username: String, firstName: String, lastName: String, batchId: Int, imageUrl: String) 我想浏览这个列表,取出所有用户名,并将这些用户名发送到一个API,该API将返回一个JSON列表,其中包含Twitter特定的信息(例如个人资料信息和Twitter个人资料图像)。然后,我想获取返回对象的列表,并将其中每个对象中的信息添加到我的原

我有一个用户对象列表,每个用户对象如下所示:

case class User(username: String, firstName: String, lastName: String, batchId: Int, imageUrl: String)
我想浏览这个列表,取出所有用户名,并将这些用户名发送到一个API,该API将返回一个JSON列表,其中包含Twitter特定的信息(例如个人资料信息和Twitter个人资料图像)。然后,我想获取返回对象的列表,并将其中每个对象中的信息添加到我的原始对象列表中,按用户名匹配


我怎样才能以功能性的方式完成这项工作呢?

你几乎按照你说的那样做。我假设您可以找到如何接触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,将其解析为从用户名到您需要的任何新信息的映射,然后通过用户记录映射,用新信息更新它们。然后停止使用
alluser
,开始使用
newUsers

这才是真正的诀窍:不是更新现有记录,而是基于旧记录重新生成新记录列表(
copy
是为这种更新而构建的)

如果在获取twitter信息后您的用户记录需要不同(即,原始对象不只是包含数据的存根),那么您还需要将默认映射器从未twitter化的
user
写入
UserWithTwitter
类。或者您的
用户
可以有一个
twitterry
字段,该字段是一个
选项[TwitterInfo]
,您可以先将其设置为
None
,然后
复制(twitterry=Some(t))
,如果您确实找到了该信息

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