如何使用for comprehension生成集合(无收益)

时间:2014-04-29 13:54:00

标签: scala

很久以前,我很想知道这件事。 Scala促进了不变性(我非常喜欢)。然而,循环带来了一个大问题。这样做的常用方法是使用for for comprehension并使用yield,我倾向于尽我所能。但是,在某些情况下我无法使用yield。如何生成没有yield的集合并将其分配给变量?

例如:

  def dirRun(dir: String) = {
    //change this part
    println("Start dir run!")
    val companyList: ListBuffer[(Int, Doc)] = ListBuffer()

    val file = new File(dir)
    for (f <- file.listFiles if f.getName.endsWith(".txt")) {
      println(f.getAbsolutePath)
      companyList += run(f)
    }
    companyList
  }

这是一个目录运行方法,它调用处理单个文件的run()方法。目录运行扫描文件夹,然后调用run()run()返回一个列表,程序将其附加到列表中。最终目标是能够杀死可变ListBuffer并将for循环分配给变量,但我不知道如何。

这是run()方法的签名:def run(file: File):(Int, Doc)(它返回一个元组)。

我该如何解决这个问题?


我认为这个问题仍然与那些不了解yieldmap等概念的人有关。我老老实实地读了一本关于Scala的书(但它并没有多说yieldmap

2 个答案:

答案 0 :(得分:7)

嗯,为什么你不能使用产量?收益率是一种很好的方法:

val companyList = 
  for (f <- file.listFiles if f.getName.endsWith(".txt")) yield {
    println(f.getAbsolutePath)
    run(f)
  }

yield之后的事情只是一个表达。在这种情况下,它是一个块。 yield之后的块与任何块相同:您可以在其中执行任何操作。然后块中的最后一个表达式是放在最终集合中的东西。

答案 1 :(得分:1)

您可以使用map

val files = for (f <- file.listFiles if f.getName.endsWith(".txt")) yield f
files.map(f => println(f.getAbsolutePath); run(f))