Scala 为什么我的名单是空的?

Scala 为什么我的名单是空的?,scala,Scala,我有以下代码: val products = List() def loadProducts(report: (Asset, Party, AssetModel, Location, VendingMachineReading)) = { report match { case (asset, party, assetModel, location, reading) => EvadtsParser.parseEvadts

我有以下代码:

    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)
你能告诉我我做错了什么,因为产品清单是空的吗?如果我在
loadProducts
方法中打印ln
products
,则products不是空的。我做的连接错误吗


PS:我是scala初学者。

正如我已经说过的,::生成一个新列表,而不是对现有列表进行修改

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

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

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)

另外,
flatMap(…)
类似于
map(…)。flatte
,所以不要被我和托马斯写得如此不同所迷惑。

列表
类型是不可变的,
val
意味着一个永远不变的引用。因此,您无法真正更改
产品
参考的内容。我建议先建立一个“列表列表”,然后将其展平:

val products = results.map(loadProducts).flatten
println(products)
请注意,
map(loadProducts)
只是
map(loadProducts())
的缩写,它是
map(result=>loadProducts(result))
的缩写

如果您变得更有经验,请尝试
foldLeft()
方法,这种方法可以不断构建
产品
列表,就像您想要做的那样:

results.foldLeft(List[Int]())((agg, result) => agg ++ loadProducts(result))

生成一个新列表,而不是对已有列表进行修改。@om nom nom我想它会在列表的末尾添加元素。。。