所以,我只想澄清什麼是您的實施情況發生。
首先,您可能需要了解理解工作的方式。
https://docs.scala-lang.org/tutorials/FAQ/yield.html
Scala的「爲內涵」是 用foreach,地圖,flatMap,過濾器或withFilter多個操作的組合物語法糖。
而且你的代碼沒有任何yield
將被翻譯成具有返回類型Unit
這意味着你將永遠不會得到列表出來的forEach
方法的事實。
我會嘗試一步步修改你的代碼。
for (id <- 1 to 10) {
allocs.map(alloc => Alloc.apply(alloc.segId, id, alloc.cos, alloc.fare, alloc.type, false, alloc.cosLev))
}
您不需要明確地調用apply
。 apply
方法只是一個語法糖,如果你實現它,你可以像使用函數一樣使用它。在這種情況下,case class
已爲您完成工作。
(關於這個主題在這裏更多:https://twitter.github.io/scala_school/basics2.html#apply)
for (id <- 1 to 10) {
allocs.map(alloc => Alloc(alloc.segId, id, alloc.cos, alloc.fare, alloc.type, false, alloc.cosLev))
}
而且你不需要換理解這裏,也因爲將要更新的東西只是id
和promo
所以你可以使用copy
提供通過case class
。
allocs.map(alloc => alloc.copy(id = id, promo = false))
的只是
allocs.map(_.copy(id = id, promo = false))
你想要的ID填補了從1到10,所以你可以只zip
他們一起將返回列表[(智力,分配),並使用部分地圖它
函數來進行模式匹配並對元組進行解構。
(更多的部分功能:https://twitter.github.io/scala_school/pattern-matching-and-functional-composition.html#PartialFunction)
allocs
.zip(1 to 10)
.map {
case (alloc, id) => alloc.copy(id = id.toString, promo = false)
}
而且,是的,如果你喜歡,你可以使用zipWithIndex
爲米克爾建議。
我想指出的最後一件事是,我看到type
屬於Alloc
,它的類型爲String
。
這可能與問題無關,但您可以更多地利用Scala類型系統的強大功能來確保程序的正確性。由於可能性較小意味着更多的可預測性。所以你可以考慮使用sum類型(或union類型)。
(更多總和類型:http://tpolecat.github.io/presentations/algebraic_types.html#11)
看看https://stackoverflow.com/questions/9891407/getting-the-desugared-part-of-a-scala-for-comprehension-expression - 那麼它應該更容易應用http://docs.scala-lang.org/overviews/parallel-collections/overview.html#creating-a-parallel-collection – Reactormonk
在映射之前,什麼是alloc的id?它們是如何生成的? 我只是想知道爲什麼它不會與其他人一起生成。 – iboss
ID是字符串,它們初始化爲「」 – Silverouge