Конкатенация строк стала функциональной - PullRequest
28 голосов
/ 21 февраля 2012

Предположим, есть 3 строки:

protein, starch, drink

Объединяя их, мы могли бы сказать, что к обеду:

Пример:

val protein = "fish"
val starch = "chips"
val drink = "wine"

val dinner = protein + ", " + starch + ", " + drink

Но что, если чего-то не хватает, например, белка, потому что моя жена ничего не могла поймать. Тогда у нас будет: ,chips, drink на ужин.

Существует удобный способ объединить строки для добавления запятых - Я просто не знаю, что это; -) . У кого-нибудь есть хорошая идея?

Я ищу что-то вроде:

val dinner = protein +[add a comma if protein is not lenth of zero] + starch .....

Это просто забавное упражнение, которое я выполняю, так что потей, если это нельзя сделать каким-нибудь классным способом. Причина, по которой я пытаюсь выполнить условную конкатенацию в одном назначении, заключается в том, что я часто использую подобные вещи в XML, и хорошее решение сделает вещи ..... приятнее.

Ответы [ 5 ]

40 голосов
/ 21 февраля 2012

Когда вы говорите «это может отсутствовать», тип этой сущности должен быть Option[T].Тогда,

def dinner(components: List[Option[String]]) = components.flatten mkString ", "

Вы бы вызвали это так:

scala> dinner(None :: Some("chips") :: Some("wine") :: Nil)
res0: String = chips, wine

На случай, если вы абсолютно хотите проверить пустоту строки,

def dinner(strings: List[String]) = strings filter {_.nonEmpty} mkString ", "

scala> dinner("" :: "chips" :: "wine" :: Nil)
res1: String = chips, wine
13 голосов
/ 21 февраля 2012
scala> def concat(ss: String*) = ss filter (_.nonEmpty) mkString ", "
concat: (ss: String*)String

scala> concat("fish", "chips", "wine")
res0: String = fish, chips, wine

scala> concat("", "chips", "wine")
res1: String = chips, wine

scala>
13 голосов
/ 21 февраля 2012

Вы ищете mkString в коллекциях, может быть.

val protein = "fish"
val starch = "chips"
val drink = "wine"

val complete = List (protein, starch, drink) 
val partly =  List (protein, starch) 

complete.mkString (", ")
partly.mkString (", ")

приводит к:

res47: String = fish, chips, wine
res48: String = fish, chips

Вы можете даже указать начало и конец:

scala> partly.mkString ("<<", ", ", ">>")
res49: String = <<fish, chips>>
5 голосов
/ 22 февраля 2012

Это относится к случаю пустых строк, а также показывает, как можно использовать другую логику для фильтрации и форматирования. Это будет нормально работать для List[String] и обобщается до List[Any].

val input = List("fish", "", "chips", 137, 32, 32.0, None, "wine")

val output = input.flatMap{ _ match { 
  case None => None
  case x:String if !x.nonEmpty => None
  case x:String => Some(x)
  case _ => None
}}
.mkString(",")

res1: String = fish,chips,wine

Идея состоит в том, что flatMap принимает List[Any] и использует сопоставление для присвоения None для любых элементов, которые вы не хотите сохранять в выходных данных. Ноны сгладятся, а некоторые останутся.

Если вам нужно было обрабатывать разные типы (Int, Double и т. Д.), Вы можете добавить больше дел.

0 голосов
/ 30 декабря 2015
println(s"$protein,$starch,$drink")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...