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)

你能告诉我我做错了什么,因为产品列表是空的吗?如果我 println productsinsideloadProducts方法,产品不为空。我做错了连接吗?

PS:我是一个Scala初学者。

4

2 回答 2

7

正如我已经说过的, ::: 会产生一个新列表,而不是改变您已经拥有的列表。

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

你有两个选择:不可变和可变

以下是您可以以不可变和惯用的方式执行的操作:

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

Listtype 是不可变的,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 回答