Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 字符串串联函数_Scala - Fatal编程技术网

Scala 字符串串联函数

Scala 字符串串联函数,scala,Scala,假设有3个字符串: protein, starch, drink 将这些连接起来,我们可以说晚餐是什么: 例如: val protein = "fish" val starch = "chips" val drink = "wine" val dinner = protein + ", " + starch + ", " + drink 但是如果因为我妻子抓不到任何东西而丢失了一些东西,比如蛋白质,那该怎么办呢。然后,我们晚餐吃:、薯条、饮料 有一种巧妙的方法可以连接字符串以选择性地添加逗

假设有3个字符串:

protein, starch, drink
将这些连接起来,我们可以说晚餐是什么:

例如:

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

val dinner = protein + ", " + starch + ", " + drink
但是如果因为我妻子抓不到任何东西而丢失了一些东西,比如蛋白质,那该怎么办呢。然后,我们晚餐吃:
、薯条、饮料

有一种巧妙的方法可以连接字符串以选择性地添加逗号-我只是不知道它是什么;-)。有人有好主意吗

我要找的东西是:

val dinner = protein +[add a comma if protein is not lenth of zero] + starch .....
这只是我正在做的一个有趣的运动,所以现在如果不能用凉爽的方式来做的话,就出汗吧。我之所以尝试在单个赋值中执行条件连接,是因为我在XML中经常使用这种类型的东西,一个好的解决方案会使事情。。。。。更好。

当你说“它可能不存在”时,这个实体的类型应该是
选项[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

您可能正在寻找有关收藏的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>>
scala>party.mkString(“”)
res49:字符串=

这将处理空字符串的情况,并显示如何放置用于筛选和格式化的其他逻辑。这对于
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
获取一个
列表[Any]
,并使用匹配为不希望保留在输出中的任何元素分配
None
。没有人被压扁,有些人留下来


如果您需要能够处理不同的类型(Int、Double等),那么您可以添加更多的情况。

Scala有
非空
,Java 1.6有
isEmpty
。。。当你只想知道字符串是否为空时,为什么还要比较长度呢?谢谢!我已经更改了答案。@Luigipling肯定它更简洁,但您描述的是如何测试条件,而不是告知条件是什么。@Luigipling说得简洁,我不同意。:-)@DanielC.Sobral isEmpty是字符串的本地语言;NoneEmpty是一个昂贵的增强。谢谢,我从未见过*在Scala中使用。显示了我在Scala呆了多久。它有名字吗?提醒我C++中的指针。它被称为“重复的参数”在“楼梯书”(“Scala编程”由M. Odersky,L.Spon和B.VeNeNes)。我认为“变长论证”也不错。谢谢@AlexanderAzarov,这将教会我在阅读封面之前使用一本书作为参考。叶,在那里好的:第二版印刷本第156页,准确地说;-)不,它不起作用,如果
protein
是空字符串,它将打印错误的内容。仅代码块不能提供好的答案。请添加解释(为什么解决问题,错误在哪里等…)
println(s"$protein,$starch,$drink")
println(s"$protein,$starch,$drink")