当我们需要连接一个字符串数组时,我们可以使用mkString方法:
val concatenatedString = listOfString.mkString
但是,当我们有一个很长的字符串列表时,获取连接字符串可能不是一个好的选择。在这种情况下,直接打印到输出流会更加合适,将其写入输出流很简单:
listOfString.foreach(outstream.write _)
但是,我不知道附加分隔符的简洁方法。我试过的一件事就是用索引循环:
var i = 0
for(str <- listOfString) {
if(i != 0) outstream.write ", "
outstream.write str
i += 1
}
这很有效,但它太罗嗦了。虽然我可以使函数封装上面的代码,但我想知道Scala API是否已经有一个函数做同样的事情。
谢谢。
答案 0 :(得分:4)
这是一个以更优雅的方式做你想要的功能:
def commaSeparated(list: List[String]): Unit = list match {
case List() =>
case List(a) => print(a)
case h::t => print(h + ", ")
commaSeparated(t)
}
递归避免了可变变量。
为了使其更具功能性,您可以传递要在每个项目上使用的功能,即:
def commaSeparated(list: List[String], func: String=>Unit): Unit = list match {
case List() =>
case List(a) => func(a)
case h::t => func(h + ", ")
commaSeparated(t, func)
}
然后通过以下方式调用它:
commaSeparated(mylist, oustream.write _)
答案 1 :(得分:2)
我相信你想要的是mkString
的重载定义。
mkString
的定义:
scala> val strList = List("hello", "world", "this", "is", "bob")
strList: List[String] = List(hello, world, this, is, bob)
def mkString: String
scala> strList.mkString
res0: String = helloworldthisisbob
def mkString(sep: String): String
scala> strList.mkString(", ")
res1: String = hello, world, this, is, bob
def mkString(start: String, sep: String, end: String): String
scala> strList.mkString("START", ", ", "END")
res2: String = STARThello, world, this, is, bobEND
修改的 怎么样?
scala> strList.view.map(_ + ", ").foreach(print) // or .iterator.map
hello, world, this, is, bob,
答案 2 :(得分:2)
不适合并行化代码,但不然:
val it = listOfString.iterator
it.foreach{x => print(x); if (it.hasNext) print(' ')}
答案 3 :(得分:1)
自我答案:
我写了一个函数封装了原始问题中的代码:
implicit def withSeparator[S >: String](seq: Seq[S]) = new {
def withSeparator(write: S => Any, sep: String = ",") = {
var i = 0
for (str <- seq) {
if (i != 0) write(sep)
write(str)
i += 1
}
seq
}
}
你可以像这样使用它:
listOfString.withSeparator(print _)
也可以指定分隔符:
listOfString.withSeparator(print _, ",\n")
谢谢大家回答我的问题。我想要使用的是简洁而不是太慢的表示。 withSeparator的隐式函数看起来像我想要的东西。所以我接受了我自己对这个问题的回答。再次感谢你。
答案 4 :(得分:1)
这是避免var
的另一种方法listOfString.zipWithIndex.foreach{ case (s, i) =>
if (i != 0) outstream write ","
outstream write s }