2017-09-04 3 views
0

私は、このオブジェクトのリストを持っている:スカラーで正しくマップするには?

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

、私は現在10のリストを持っている、すべての属性がpaxId除いた値を持っている、すべてのオブジェクトは、「」持っています。 今、私は各paxIdをインクリメントしたいと思います。つまり、最初のAllocにはpaxId = 1、2番目には2 ...、10番目には10です。 私はこれを試してみました:paxIds

なしの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を私はスカラ座での初心者です、私は失われています、あなたは私を助けることができるでしょう願っています。事前

おかげ

+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

マップする前に、idsのIDは何ですか?彼らは最初にどのように生成されていますか? なぜ私はそれが他人と一緒に生成されていないのだろうかと思います。 – iboss

+0

idsは文字列で、 ""で初期化されています – Silverouge

答えて

2

あなたはzipWithIndexを使用して、ちょうどあなたの実装で何が起こっているか明確にするために、したがって、各オブジェクトのただ一つのフィールド

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

はうまくいきます!どうもありがとう! :) – Silverouge

0

を変更するためにcopyを使用することができます。

まず、理解の仕組みを理解する必要があります。

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

そして、あなたが更新されます物事はあなたが提供copyを使用することができるだけでidpromoあるもあるため、ここでのために、理解する必要はありませんcase class。あなたは1から10までのIDを埋めるしたいだけ

allocs.map(_.copy(id = id, promo = false)) 

allocs.map(alloc => alloc.copy(id = id, promo = false)) 

ので、あなただけのzip一緒に一覧[(INT、のAlloc)]を返すと部分使用して、それをマップすることができますパターンマッチングを行い、タプルを破棄する関数です。

(一部機能の詳細: 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を使用することができます。

私が指摘したい最後のことは、のAllocのプロパティとしてtypeと表示されています。

これは質問には関係しないかもしれませんが、Scalaタイプのシステムの力をより多く活用してプログラムの正確性を保証することができます。値が小さいほど予測可能性が高いからです。したがって、代わりに和型(または共用体)を使用することを検討してください。

(和タイプの詳細:http://tpolecat.github.io/presentations/algebraic_types.html#11

関連する問題