假设有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中使用了这种类型的东西,一个好的解决方案会使事情变得更好.......
答案 0 :(得分:40)
当您说“可能缺席”时,此实体的类型应为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
答案 1 :(得分:13)
你正在寻找集合上的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>>
答案 2 :(得分:13)
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>
答案 3 :(得分:5)
这会处理空字符串的情况,还会显示如何将其他逻辑用于过滤和格式化。这适用于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
。 Nones被夷为平地,Somes留了下来。
如果你需要能够处理不同的类型(Int,Double等),那么你可以添加更多的案例。
答案 4 :(得分:-4)
println(s"$protein,$starch,$drink")