Альтернатива foldLeft, которая начинается со второго элемента - PullRequest
1 голос
/ 28 февраля 2011

У меня есть List, определенное как:

val l = List("1", "2", "3")

Я хочу преобразовать его в строку

"1:2:3"

Один из способов заключается в следующем:

l.foldLeft("")((x, y) => x + (if (x == "") "" else ":") +y)

Есть ли более элегантный метод?

[РЕДАКТИРОВАТЬ: дальнейшие объяснения]

Ответ Easy Angel срабатывает, когда элементы l имеют «значимый» метод toString.

хотя у меня l как List[String], l может быть списком пользовательского типа, который не переопределяет метод toString, скажем, как:

class my(i:Int) {
  val x = i
}

У меня тоже есть метод

def getMy(m:my) = "Hello "+m.x

Так что я бы хотел, чтобы вывод getMy использовался вместо вывода метода toString по умолчанию.

Ответы [ 3 ]

8 голосов
/ 28 февраля 2011

Вы можете использовать mkString метод List:

l mkString ":"

Более подробную информацию можно найти в scaladoc:

http://www.scala -lang.org / апи / гс / Скала / Коллекция / Iterable.html # mkString: String


В качестве альтернативы вы можете использовать reduceLeft, например:

l.reduceLeft(_ + ":" + _)

В качестве ответа на ваш второй вопрос: просто объедините его с map:

l map getMy mkString ":"
2 голосов
/ 28 февраля 2011

еще один способ сделать это с помощью foldLeft:

l.tail.foldLeft(l.head)( (x, y) => x+":"+y )
1 голос
/ 28 февраля 2011

Другие предложения лучше, но если вы хотите сохранить foldLeft, вы можете использовать Опции:

List("1","2","3").foldLeft(None:Option[String])((o,n)=> o.map(_+":"+n).orElse(Some(n))).get
//res2: String = 1:2:3
...