编辑:我找到了 What is Scala's yield? (尤其是第二个,最受欢迎的答案)在接受的答案解决了我的问题后非常有启发性。
==
我有一个 HashMap,我想对其进行迭代,并且对于每个键,使用 for 循环来创建新对象。
我正在尝试获取这些新对象的列表,但总是返回一个空的“单元”序列。我想更好地了解我的代码的行为。
case class MyObject(one: String, two: String, three: Int)
val hm = new HashMap[String,Int]
hm += ("key" -> 3)
hm += ("key2" -> 4)
val newList = hm.map { case (key,value) =>
for (i <- 0 until value) {
new MyObject(key, "a string", i)
}}.toSeq
结果:
newList:Seq[Unit] = ArrayBuffer((), ())
如果我在 .map() 中不使用任何 for 循环,我就有了我期望的结构类型:
val newList = hm.map { case (key,value) =>
new MyObject(key, "a string", value)}.toSeq
结果:
newList:Seq[MyObject] = ArrayBuffer(MyObject(key,host,3), MyObject(key2,host,4))
最佳答案
正如我在评论中提到的,您在 map
语句的 for 理解中缺少 yield
。如果您不包含 yield
关键字,那么您的 for 理解纯粹是副作用,不会产生任何结果。将其更改为:
for (i <- 0 until value) yield {
现在,您将得到一个 Seq[IndexedSeq[MyObject]]
。如果你只想得到一个 Seq[MyObject]
那么你可以像这样 flatten
:
val newList = hm.map { case (key,value) =>
for (i <- 0 until value) yield {
MyObject(key, "a string", i)
}}.toSeq.flatten
}
事实上(正如@KarolS 所指出的),您可以通过将 map
替换为 flatMap
并删除显式 flatten
在最后:
val newList = hm.flatMap { case (key,value) =>
for (i <- 0 until value) yield {
MyObject(key, "a string", i)
}}.toSeq
}
关于scala - For循环在scala : return type is "Unit"中的.map()内,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31246982/