2015-03-12 5 views
1

Мне нужно взять список классов case и преобразовать их в a в одну строку с запятой (без заголовка или хвостовой запятой) ,складывание списка классов в одну строку, разделенную запятой (в Scala)

case class State(name: String) 

def toLine(states: State*): String = { 
} 

так, toLine (State ("один"), государство ("два"), государство ("три")) должен возвращать один, два, три

вот что я подумал. любой лучший способ?

def toLine(states: State*): String = { 
    states match { 
    case s if s.isEmpty => throw new Exception 
    case s => s.tail.foldLeft(s.head.name)(_+","+_) 
    } 
} 

Есть ли способ гарантировать, что в списке будет хотя бы одно значение?

ответ

3

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

def toLine(states: State*): String = states.map(_.name).mkString(",") 

, если вам нужно, чтобы обеспечить, по меньшей мере, один элемент, вы можете сделать:

def toLine(state: State, states: State*) = (state +: states).map(_.name).mkString(",") 
0

коллекции Scala обеспечивают функцию именно это сделать: states.map(_.name).mkString(",")

Если вы хотите, чтобы убедиться, что toLine всегда вызывается по крайней мере одно значение, вы можете сделать это:

def toLine(state: State, states: State*): String = { 
    states.map(_.name).mkString(",") 
} 

Это переместит которые проверяют систему типов, а не делают это во время выполнения.

+0

интересно, работает ваш код дал мне это: Скала> Защиту toLine (state: State, states: State *): String = { | states.mkString (",") | } toLine: (state: State, states: State *) String scala> toLine (State ("one"), State ("two"), State ("three")) res0: String = State (two), Штат (три) –

+0

Забыл на карту имя. – Ryan

Смежные вопросы