如果我有一个地图并希望通过迭代来构建一个字符串,有没有办法让最终字符串成为表达式的结果,而不是定义一个变量并在循环中修改它?
而不是
val myMap = Map("1" -> "2", "3"->"4")
var s = ""
myMap foreach s += ...
我宁愿它
var s = myMap something ...
答案 0 :(得分:17)
我只是map
和mkString
。例如:
val s = (
Map("1" -> "2", "3"->"4")
map { case (key, value) => "Key: %s\nValue: %s" format (key, value) }
mkString ("", "\n", "\n")
)
答案 1 :(得分:13)
至于丹尼尔的回答,但有一些优化和我自己的格式偏好:
val myMap = Map("1" -> "2", "3"->"4")
val s = myMap.view map {
case (key, value) => "Key: " + key + "\nValue: " + value
} mkString ("", "\n", "\n")
优化:
view
,我避免创建中间集合String.format
答案 2 :(得分:7)
你可以用折叠来做到这一点:
scala> myMap.foldLeft("") { (s: String, pair: (String, String)) =>
| s + pair._1 + pair._2
| }
res0: java.lang.String = 1234
答案 3 :(得分:2)
我对Scala很新,但你可以试试reduceLeft
。它会累积一个部分值(与每个元素连接的字符串)。例如,如果您希望在字符串中加入键(或值),请执行以下操作:
val s = myMap.keys.reduceLeft( (e, s) => e + s)
这导致“13
”
答案 4 :(得分:2)
如果您不打扰自己的格式,这也可以。
scala> Map("1" -> "2", "3"->"4").mkString(", ")
res6: String = 1 -> 2, 3 -> 4