Соединить строки с XML-узлом между в Scala - PullRequest
8 голосов
/ 19 декабря 2011

У меня есть список строк, и мне нужно соединить их вместе с
тегами между ними. Итак, начиная с:

val list = List("line1", "line2", "line3")

Мне нужно получить NodeSeq:

line1<br/>line2<br/>line3

Возможно, список содержит только один элемент, и в этом случае я должен получить NodeSeq только для Text ("line1").

Есть ли однострочник для этого, использующий одну из функций высшего порядка в списке? Я пытался поиграть с foldLeft, но не могу заставить его делать то, что я хочу.

Ответы [ 3 ]

12 голосов
/ 19 декабря 2011
list.map(scala.xml.Text(_):scala.xml.NodeSeq).reduce(_ ++ <br /> ++ _)

Обратите внимание, что мы должны расширить тип до scala.xml.NodeSeq вручную, поскольку Text слишком ограничивает метод reduce. Чем лаконичнее

list.map(scala.xml.Text).reduce(_ ++ <br /> ++ _)

не скомпилируется.

3 голосов
/ 19 декабря 2011

Если вы не возражаете против использования Scalaz , есть intersperse:

import scalaz._
import Scalaz._

list.map(xml.Text(_): xml.Node).intersperse(<br/>): xml.NodeSeq
0 голосов
/ 19 декабря 2011

Согласитесь с тем, что ответила Дебильски.Еще один способ добиться того же:

import scala.xml._

XML.loadString("<root>" + list.mkString("<br/>") + "</root>").child:NodeSeq

Но использование карты / уменьшения - более чистый подход.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...