所以,我只想澄清什么是您的实施情况发生。
首先,您可能需要了解理解工作的方式。
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