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
方法中打印lnproducts
,则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我想它会在列表的末尾添加元素。。。