scala - For循环在scala : return type is "Unit"中的.map()内

标签 scala

编辑:我找到了 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/

相关文章:

scala - 将泛型定义为案例类

html - Play 框架中如何使用 IF 语句让 CSS 仅用于一页

scala - 喷雾路由 404 响应

java - BufferedStream 链接 Scala(或 Java)

scala - 在 Scala 中使用反射的奇怪行为

scala - sbt 取决于 % "compile->compile;test->test"

java - 试图让 InetAddress.getLocalHost.getHostAddress (Java/Scala) 返回外部 IP

scala - Scala 中的好友访问

scala slick通过一个模型处理2个以上相同结构的表

scala - 如何在不进行硬编码的情况下使用 Cake 模式进行依赖注入(inject)?