簡體   English   中英

對於scala中的.map()內部的循環:返回類型是“單位”

[英]For loop inside a .map() in scala: return type is “Unit”

編輯:我發現這是什么是斯卡拉的收益? (特別是第二個,最受歡迎的答案)在接受的答案解決了我的問題后非常有啟發性。

==

我有一個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 comprehension的yield 如果你不包含yield關鍵字那么你的理解純粹是副作用而且不會產生任何結果。 將其更改為:

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所指出的那樣)你可以通過用flatMap替換map並在最后刪除顯式flatten進一步縮短它:

val newList = hm.flatMap { case (key,value) =>
  for (i <- 0 until value) yield {
    MyObject(key, "a string", i)
  }}.toSeq
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM