Scala 类 和列表

Scala classes and List

所以我的简短代码片段如下所示:

Source.fromFile(fileName).getLines().foldLeft(List[CsvEntry]())((csvList, currentLine) =>
 currentLine match {
  case pattern(organisation,yearAndQuartal,medKF,trueOrFalse,name,money) => new CsvEntry(organisation,yearAndQuartal,medKF.toInt,trueOrFalse.toInt,name,money) :: csvList
  case default => csvList

"fileName" 只是文件的名称,但对我的问题无关紧要。 我的 csvList 是这样定义的:

type csvList = List[CsvEntry]
val list: csvList = List()

我的 class 看起来像这样:

class CsvEntry(val organisation: String, val yearAndQuartal : String, val medKF:Int, val trueOrFalse: Int, val name: String, val money:String){
override def toString = s"$organisation, $yearAndQuartal, $medKF,$trueOrFalse, $name, $money"

所以我的问题是,每当我加载一个文件并将其写入我的 csvList 时,它就可以工作,但是当我加载另一个第二个文件时,旧内容会被覆盖。 我该如何更改它才能不被过度使用,所以它应该只将它添加到前面的数据中?

呼叫开始 Source.fromFile... returns 一个列表,然后您应该将其与下一个呼叫合并。

例如:

List("filename1", "filename2").map(processFile).flatten

其中 processFile 是:

def processFile(fileName: String) = {
  Source.fromFile(fileName).getLines().foldLeft... all the code in question
}

这里没有任何东西可以得到 "overwritten",因为没有可变状态。 type csvListfoldLeft 调用中的 csvList 是两个截然不同的东西:前者是类型,后者是参数。

每次执行您的代码段时,它都会 returns 特定文件的 CSV 对象列表。作为不可变列表。

你想要的是:

  • 根据您的代码段创建函数:def readFile(name: String): List[CsvFile]
  • 在两个文件上调用它并将结果保存到 vals
  • 连接两个列表:list1 ++ list2