我一直试图在for循环中计算,但结果只是用括号结束。我只是在地图上打印出关键字。
var count = 0
xs.foreach(x => (myMap += ((count+=1).toString+","+java.util.UUID.randomUUID.toString -> x)))
输出:
(),901e9926-be1e-4dc4-b3e3-6c3b2feea2c4
预期产出:
1,901e9926-be1e-4dc4-b3e3-6c3b2feea2c4
答案 0 :(得分:1)
您在此处打印的内容实际上是(count+=1).toString
。在Scala中,这样的赋值将被计算为Unit
,它由括号表示。这就是您打印()
而不是count
的价值的原因。如果您之后检查count
变量值,则会看到1
符合预期。
此外,您尝试做的事情可以用更好的方式表达,例如,您可以这样做:
val myMap = xs.zipWithIndex.map(x => (x._2 + 1) + "," + java.util.UUID.randomUUID -> x._1).toMap
答案 1 :(得分:1)
在foreach
内,count += 1
的类型为Unit
。如果我正确理解了您的问题,下面的示例(使用任意xs
集合)可能就是您要查找的内容:
val xs = List("a", "b", "c", "d")
var count = 0
var myMap = Map[String, String]()
xs.foreach{ x =>
count += 1
myMap += ((count.toString + "," + java.util.UUID.randomUUID.toString) -> x)
}
myMap.keys
// res1: Iterable[String] = Set(
// 1,bd971c44-b9d0-41a0-b59f-3acbf2e0dee0, 2,5459eed9-309d-4f9c-afd7-10aced9df2a0,
// 3,5816ea42-d8ed-4beb-8b30-0376d0674700, 4,30f6f22f-1e6d-4eec-86af-5bc6734d5196
// )
如果您想要更加惯用的方法,请使用zip
作为计数,使用foldLeft
进行地图聚合会产生类似的结果:
val myMap = Map[String, String]()
val resultMap = xs.zip(Stream from 1).foldLeft( myMap )(
(m, x) => m + ((x._2.toString + "," + java.util.UUID.randomUUID.toString) -> x._1)
)