Scala 如何将数组[Node]转换为NodeSeq?

Scala 如何将数组[Node]转换为NodeSeq?,scala,scala-2.8,lift,Scala,Scala 2.8,Lift,我正在尝试将一个Lift应用程序集成到一些现有的Java代码中。在我的一个代码片段中,我有一个Java对象数组,需要将其映射到NodeSeq。我可以得到一个节点数组,但不能得到一个NodeSeq。(至少,从功能上看不是很好) 导入scala.xml.NodeSeq //假装这是我无能为力的代码 val数据=数组(“一”、“二”、“三”) //这是我需要编写的函数 def foo:NodeSeq=data.map{s=>{s} // ^ //错误:

我正在尝试将一个Lift应用程序集成到一些现有的Java代码中。在我的一个代码片段中,我有一个Java对象数组,需要将其映射到NodeSeq。我可以得到一个节点数组,但不能得到一个NodeSeq。(至少,从功能上看不是很好)

导入scala.xml.NodeSeq
//假装这是我无能为力的代码
val数据=数组(“一”、“二”、“三”)
//这是我需要编写的函数
def foo:NodeSeq=data.map{s=>{s}
//                          ^
//错误:类型不匹配;
//找到:数组[scala.xml.Elem]
//必需:scala.xml.NodeSeq
最干净的方法是什么?

scala>import collection.breakOut
scala> import collection.breakOut
import collection.breakOut

scala> def foo: NodeSeq = data.map { s => <x>{s}</x> }(breakOut)
foo: scala.xml.NodeSeq
导入集合.breakOut scala>def foo:NodeSeq=data.map{s=>{s}(突破) foo:scala.xml.NodeSeq
方法映射实际上有两个参数列表。第一个接受您传递的函数。第二个接受CanBuildFrom对象,该对象用于创建构建器,然后构建返回序列。此参数是隐式的,因此编译器通常会为您填充它。它接受3个类型参数:From、T、To。有几个predef隐式(包括在对象NodeSeq中),但它们都不匹配From=Array、T=Node、To=NodeSeq


breakOut解决了这个问题:它是一个通用方法,通过搜索隐式的CanBuildFrom[Nothing,T,To]返回CanBuildFrom实例。根据隐式搜索规则,任何与T、to和has From>匹配的CanBuildFrom都是可接受的。在这种情况下:canBuildFrom In object Array

我只需将
映射
输出转换为序列(假设
Seq[Node]
NodeSeq
的一个超类)


您正在NodeSeq伴生对象上查找此方法

NodeSeq.fromSeq(s: Seq[Node])

您总是有可用的
++
方法:-)
新节点seq()+++the数组Elm\u thing
。也许有更好的办法。Happy coding.NodeSeq是抽象的,因此“new NodeSeq()”不起作用。似乎可以链接到突破性的问题:toSeq是我想要的优雅。谢谢使用map和toSeq意味着您正在创建两个集合。使用breakOut创建的是1。
toSeq
创建了一个包装器(),因此性能损失惨重。
scala> def foo: NodeSeq = data.map { s => <x>{s}</x> } toSeq
foo: scala.xml.NodeSeq
scala> def foo: NodeSeq = (Seq[Node]() /: data) {(seq, node)=> seq ++ <x>{node}</x>}
foo: scala.xml.NodeSeq
NodeSeq.fromSeq(s: Seq[Node])