Конкатенация строк исчезла
Предположим, что существует 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, и приятное решение сделает вещи более приятными.
Ответы
Ответ 1
Когда вы говорите "он может отсутствовать", этот тип сущности должен быть 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
Ответ 2
Вы ищете 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>>
Ответ 3
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>
Ответ 4
Это касается случая пустых строк, а также показывает, как вы могли бы поместить другую логику для фильтрации и форматирования. Это будет отлично работать для 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 и т.д.), вы можете добавить еще несколько случаев.
Ответ 5
println(s"$protein,$starch,$drink")