Pregunta

Estoy tratando de integrar una aplicación de elevación en algún código Java existente. En uno de mis fragmentos, tengo una serie de objetos Java que necesito para mapear que en un NodeSeq. Puedo conseguir una gran variedad de Nodo de, pero no un NodeSeq. (Al menos, no de manera muy de aspecto funcional).

import scala.xml.NodeSeq

// pretend this is code I can't do anything about
val data = Array("one", "two", "three")

// this is the function I need to write
def foo: NodeSeq = data.map { s => <x>{s}</x> }
//                          ^
// error: type mismatch;
//  found   : Array[scala.xml.Elem]
//  required: scala.xml.NodeSeq

¿Cuál es la forma más limpia de hacer esto?

¿Fue útil?

Solución

I simplemente sería convertir la salida map a la secuencia (dado que Seq[Node] es un super-clase de NodeSeq)

scala> def foo: NodeSeq = data.map { s => <x>{s}</x> } toSeq
foo: scala.xml.NodeSeq

o uso foldLeft en lugar de map

scala> def foo: NodeSeq = (Seq[Node]() /: data) {(seq, node)=> seq ++ <x>{node}</x>}
foo: scala.xml.NodeSeq

Otros consejos

scala> import collection.breakOut
import collection.breakOut

scala> def foo: NodeSeq = data.map { s => <x>{s}</x> }(breakOut)
foo: scala.xml.NodeSeq

El mapa método en realidad tiene dos listas de argumentos. El primero acepta una función, lo que ha pasado. El segundo acepta un objeto CanBuildFrom que se utiliza para crear un constructor que entonces construye la secuencia de regresar. Este argumento está implícito, por lo general, el compilador lo llena para usted. Se acepta 3 parámetros de tipo: de, T, A. Hay varias implícitos PREDEF (incluyendo en NodeSeq objeto), pero ninguno de ellos concordancias de = Array, T = Nodo, A = NodeSeq.

Breakout resuelve esto: es un método genérico que devuelve una instancia de CanBuildFrom mediante la búsqueda de un CanBuildFrom implícita [Nada, T, A]. De acuerdo con las reglas de búsqueda implícitas, cualquier CanBuildFrom que coincide con T, A y tiene De> Nada es aceptable. En este caso: canBuildFrom en Array objeto

Se busca este método en el objeto NodeSeq compañero.

NodeSeq.fromSeq(s: Seq[Node])
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top