2017-09-04 85 views
0

我有这个对象的列表:如何在scala中正确映射?

case class Alloc(
         segId: String, 
         paxId: String, 
         cos: String, 
         fare: String, 
         type: String, 
         promo: Boolean, 
         cosLev: String) 

,我现在有10个列表,所有的属性有不同的paxId值,所有的对象都“”。 现在我想增加每个paxId,我的意思是第一个Alloc的paxId = 1,第二个的是2,...第十个是10。 我已经试过这样:含ALLOC

val allocWithPaxIds: List[Allocation] = for (id <- 1 to 10) { 
     allocs.map(alloc=>Alloc.apply(alloc.segId, id, alloc.cos, alloc.fare, alloc.type, false, alloc.cosLev)) 
    } 

allocs没有paxIds

我在斯卡拉初学者,我迷路了,希望你能帮助我。

在此先感谢

+0

看看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

+0

在映射之前,什么是alloc的id?它们是如何生成的? 我只是想知道为什么它不会与其他人一起生成。 – iboss

+0

ID是字符串,它们初始化为“” – Silverouge

回答

2

您可以使用zipWithIndex然后用copy修改只是一个每场对象

list.zipWithIndex.map{ 
    case (v, idx) => v.copy(paxId = idx.toString) 
} 
+0

工程伟大!非常感谢! :) – Silverouge

0

所以,我只想澄清什么是您的实施情况发生。

首先,您可能需要了解理解工作的方式。

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)) 
} 

您不需要明确地调用applyapply方法只是一个语法糖,如果你实现它,你可以像使用函数一样使用它。在这种情况下,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)) 
} 

而且你不需要换理解这里,也因为将要更新的东西只是idpromo所以你可以使用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