我有以下函数。它可以很好地打印我要存储的值。我想建立一个Map[String,String]
def storePlayerEntry(n: Node, moved: Boolean) = {
moved match {
// storing a current player record
// rowkey = playerid
case true => {
//println("current: " + teamId + ":" + n)
println("id: " + n "@uID")
for (
s <- Seq("first_name",
"last_name",
"known_name",
"birth_date",
"weight",
"height",
"jersey_num",
"real_position",
"real_position_side",
"join_date",
"country")
) {
val stat = (n \ "Stat").filter(_.attribute("Type").filter(_.toString() == s).isDefined)
Option(stat.text) match {
case Some(st) if (st == "") => // do nothing
case Some(st) => println(st)
case None => // do nothing
}
}
//val ret = dataApi.upsertMulti("players",
}
case false => {
//println("old: " + teamId + ":" + n)
}
}
}
我避免声明映射,然后只添加方法,因为我确信这里还有更标量化的工作要做。
我正在寻找的地图将包含类似s->st
@jdevelop关闭。应该是这样的:
val x = (for (
s <- Seq("first_name",
"last_name",
"known_name",
"birth_date",
"weight",
"height",
"jersey_num",
"real_position",
"real_position_side",
"join_date",
"country");
val st = (n \ "Stat").filter(_.attribute("Type").filter(_.toString() == s).isDefined).text if (st != "")
) yield (s -> st)).toMap
这里有一个更惯用的方法:首先,我们制作一组我们关心的所有密钥:
val keys = Set(
"first_name",
"last_name",
"known_name",
"birth_date",
"weight",
"height",
"jersey_num",
"real_position",
"real_position_side",
"join_date",
"country"
)
注意,出于效率和逻辑的考虑,这可以在方法之外定义。
在该方法中,我们制作了一个具有Type
属性的所有Stat
元素的映射,然后使用我们的集合过滤密钥
val stats: Map[String, String] = (n \ "Stat").flatMap {
s => s.attribute("Type").map(_.toString -> s.text)
}.toMap.filterKeys(keys)
现在,我们有了一个从感兴趣的键到相应Stat
元素的文本内容的映射。例如,如果我们的n
看起来像这样:
<Player uID="john">
<Stat Type="first_name">John</Stat>
<Stat Type="last_name">Doe</Stat>
<Stat Type="some_irrelevant_thing">blah</Stat>
</Player>
根据需要,我们的结果将是Map(first_name -> John, last_name -> Doe)
。
(for (
s <- Seq("first_name",
"last_name",
"known_name",
"birth_date",
"weight",
"height",
"jersey_num",
"real_position",
"real_position_side",
"join_date",
"country");
val Some(st) = (n \ "Stat").filter(_.attribute("Type").filter(_.toString() == s).isDefined)
if (st != "")
) yield (s -> st)).toMap
类似的东西