0

私はこのコードを持っています:

    val products = List()

    def loadProducts(report: (Asset, Party, AssetModel, Location, VendingMachineReading)) = {
      report match {
        case (asset, party, assetModel, location, reading) =>

          EvadtsParser.parseEvadts(reading.evadts, result)

          (result.toMap).map(product => ReportData(
            customer = party.name,
            location = location.description,
            asset = asset.`type`,
            category = "",
            product = product._1,
            counter = product._2,
            usage = 0,
            period = "to be defined")).toList
      }
    }

results.foreach(result => products ::: loadProducts(result))
println(products)

製品リストが空であるため、私が間違っていることを教えてください。productsメソッド内でprintlnするとloadProducts、製品は空ではありません。私がやっている連結は間違っていますか?

PS: 私は scala の初心者です。

4

2 に答える 2

7

すでに述べたように、::: は、既に配置されているリストを変更するのではなく、新しいリストを生成します。

http://take.ms/WDB http://take.ms/WDB

不変と可変の2つのオプションがあります

不変で慣用的なスタイルでできることは次のとおりです。

def loadProducts(report: (...)): List[...] = {
  ...
}

val products = result.flatMap(result => loadProducs(result))
println(products)

しかし、可変性と結びつけて、ListBuffer を使用して、必要なことを行うこともできます。

def loadProducts(report: (...)): List[T] = {
  ...
}

val buffer = scala.collection.mutable.ListBuffer[T]() 
result.foreach(result => buffer ++ = loadProducs(result))
val products = buffer.toList
println(products)

PSflatMap( ...)は にmap(...).flatten似ているので、私と Tomasz が書き方が大きく異なっていることを混同しないでください。

于 2013-01-30T19:55:05.280 に答える
4

Listタイプは不変であり、val変更されない参照を意味します。したがって、参照の内容を実際に変更することはできませんproducts。最初に「リストのリスト」を作成してからフラット化することをお勧めします。

val products = results.map(loadProducts).flatten
println(products)

map(loadProducts)は の省略形でmap(loadProducts(_))あり、これは の省略形であることに注意してくださいmap(result => loadProducts(result))

より経験を積んだら、これをやりたかったのと同じように、リストfoldLeft()を継続的に構築するアプローチを試してください。products

results.foldLeft(List[Int]())((agg, result) => agg ++ loadProducts(result))
于 2013-01-30T19:58:43.720 に答える