2017-09-04 88 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