无法在forloop中打印get count结果

时间:2018-01-10 04:44:12

标签: scala

我一直试图在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

2 个答案:

答案 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)
)