字符串连接功能正常

Jac*_*ack 28 scala

假设有3个字符串:

protein, starch, drink
Run Code Online (Sandbox Code Playgroud)

连接这些,我们可以说晚餐是什么:

例:

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

val dinner = protein + ", " + starch + ", " + drink
Run Code Online (Sandbox Code Playgroud)

但是,如果缺少一些东西,例如蛋白质,那会怎么样,因为我的妻子无法捕获任何东西.然后,我们将:,chips, drink吃晚餐.

有一种灵活的方式来连接字符串以选择性地添加逗号 - 我只是不知道它是什么;-).有没有人有个好主意?

我正在寻找类似的东西:

val dinner = protein +[add a comma if protein is not lenth of zero] + starch .....
Run Code Online (Sandbox Code Playgroud)

这只是我正在做的一项有趣的运动,所以如果不能以某种很酷的方式完成,那么现在就会出汗.我试图在单个赋值中进行条件连接的原因是因为我在XML中使用了这种类型的东西,一个好的解决方案会使事情变得更好.

Ale*_*rov 40

当你说"它可能缺席"时,这个实体的类型应该是Option[T].然后,

def dinner(components: List[Option[String]]) = components.flatten mkString ", "
Run Code Online (Sandbox Code Playgroud)

你会像这样调用它:

scala> dinner(None :: Some("chips") :: Some("wine") :: Nil)
res0: String = chips, wine
Run Code Online (Sandbox Code Playgroud)

如果你绝对想要检查一个字符串的空虚,

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

scala> dinner("" :: "chips" :: "wine" :: Nil)
res1: String = chips, wine
Run Code Online (Sandbox Code Playgroud)

  • @LuigiPlinge当然它更简洁,但您正在描述如何测试条件,而不是告知条件是什么. (3认同)
  • Scala有`nonEmpty`,Java 1.6有`isEmpty` ...为什么比较长度你想要的只是知道字符串是否为空? (2认同)
  • @LuigiPlinge为了简明扼要,我不同意.:-) (2认同)

use*_*own 14

你可能正在寻找集合上的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 (", ")
Run Code Online (Sandbox Code Playgroud)

结果是:

res47: String = fish, chips, wine
res48: String = fish, chips
Run Code Online (Sandbox Code Playgroud)

您甚至可以指定开始和结束:

scala> partly.mkString ("<<", ", ", ">>")
res49: String = <<fish, chips>>
Run Code Online (Sandbox Code Playgroud)


Dan*_*ral 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>
Run Code Online (Sandbox Code Playgroud)

  • 它在"楼梯书"中被称为"重复参数"(由M.Odersky编写的"Scala编程",L.Spoon和B.Venners).我认为"变长参数"也很好. (5认同)

Jes*_*sse 5

这将处理空字符串的情况,并显示如何将其他逻辑用于过滤和格式化.这将适用于a 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
Run Code Online (Sandbox Code Playgroud)

我们的想法是flatMap采用a List[Any]并使用匹配来None为您不想在输出中保留的任何元素进行分配.Nones逐渐消失,Somes留下来.

如果你需要能够处理不同的类型(Int,Double等),那么你可以添加更多的案例.