斯卡拉:如何从一些收集
问题描述:
创建XML节点。如果你有这样的:斯卡拉:如何从一些收集
val myStuff = Array(Person("joe",40), Person("mary", 35))
如何创建与数据节点的XML值?我知道如何在XML表达式中使用{大括号}来放置一个值,但这是一组值。我需要明确迭代还是有更好的?
val myXml = <people>{ /* what here?! */ }</people>
结果值应该是这样的:
<people><person><name>joe</name><age>40</age></person>
<person><name>mary</name><age>39</age></person></people>
答
由于它是一种函数式编程语言Array.map可能是你在找什么:在
class Person(name : String, age : Int){
def toXml() = <person><name>{ name }</name><age>{ age }</age></person>;
}
object xml {
val people = List(
new Person("Alice", 16),
new Person("Bob", 64)
);
val data = <people>{ people.map(p => p.toXml()) }</people>;
def main(args : Array[String]){
println(data);
}
}
结果:
<people><person><name>Alice</name><age>16</age></person><person><name>Bob</name><age>64</age></person></people>
答
为了完整起见,你也可以使用for..yield(或函数调用):
import scala.xml
case class Person(val name: String, val age: Int) {
def toXml(): xml.Elem =
<person><name>{ name }</name><age>{ age }</age></person>
}
def peopleToXml(people: List[Person]): xml.Elem = {
<people>{
for {person <- people if person.age > 39}
yield person.toXml
}</people>
}
val data = List(Person("joe",40),Person("mary", 35))
println(peopleToXml(data))
(固定误差由伍迪福尔瑟姆说明)
答
其实,良率person.toXml()不编译对我来说,但收益person.toXml(没有括号)。原始版本抱怨'重载的方法值适用',即使我改变'ToXml'的def来明确地返回一个scala.xml.Elem
这种方法的优点是什么?我想了解更多关于Scala的信息,我很好奇。 – ScArcher2 2011-02-03 16:20:27
这只是一种不同的语法。在我的代码中,我通常使用map()而不是像Aaron Maenpaa的答案。 – hishadow 2011-02-07 18:37:13