我试图减少元素列表
List(1, 2, 3).map{n => <a>{n}</a>}.reduce{(a,b)=> a ++ b}
但是我收到了这个错误
<console>:8: error: type mismatch;
found : scala.xml.NodeSeq
required: scala.xml.Elem
List(1, 2, 3).map{n => <a>{n}</a>}.reduce{(a,b)=> a ++ b}
如何将NodeSeq转换为Elem?
答案 0 :(得分:4)
在这种情况下我会使用reduce
。相反,请尝试foldLeft
:
List(1, 2, 3).map{n => <a>{n}</a>}.foldLeft(NodeSeq.Empty){(a,b)=> a ++ b}
map
reduce
,fold
和{{1}} a whole blog post如果您对函数式编程不熟悉,可能会有帮助。
答案 1 :(得分:2)
除了joescii的回答之外,您甚至不需要使用foldLeft
来生成一系列节点。由于List
已经是一个序列而Seq[Node]
被隐式转换为NodeSeq
,因此您可以写下以下内容:
val x : NodeSeq = List(1, 2, 3).map{n => <a>{n}</a>}
此外,由于节点序列不是有效的XML文档(打破单根元素契约),您可能会将其用作生成XML的临时步骤,然后使用某些父元素包装这些节点。
如果是这种情况,则显式转换为NodeSeq
是不必要的,因为它将隐式完成,如下例所示:
val x = List(1, 2, 3).map{n => <a>{n}</a>}
<b>{x}</b>
答案 2 :(得分:0)
除了其他答案,将NodeSeq
转换为Elem
的最简单方法是:
val elemVar = nodeSeqVal(0)
如果您确定NodeSeq中始终存在唯一的节点,则可以正常工作,否则您将丢失剩余的数据。