Scala 如何生成用于理解的集合(无收益)

Scala 如何生成用于理解的集合(无收益),scala,Scala,很久以前我就在想这个。Scala促进了我非常喜欢的不变性。然而,for循环带来了一个大问题。做这件事的常用方法是使用a来理解和使用收益率,我倾向于尽可能地这样做。然而,在某些情况下,我不能使用收益率。如何在不产生收益的情况下生成集合并将其分配给变量 例如: def dirRun(dir: String) = { //change this part println("Start dir run!") val companyList: ListBuffer[(Int,

很久以前我就在想这个。Scala促进了我非常喜欢的不变性。然而,for循环带来了一个大问题。做这件事的常用方法是使用a来理解和使用收益率,我倾向于尽可能地这样做。然而,在某些情况下,我不能使用收益率。如何在不产生收益的情况下生成集合并将其分配给变量

例如:

  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返回一个列表,程序将其附加到列表中。最终目标是能够杀死可变ListBuffer并将for循环分配给变量,但我不知道如何实现

这是run方法def runfile:File:Int的符号,它返回一个元组

我该如何解决这个问题

我认为这个问题仍然与那些不理解产量或地图等概念的人有关。老实说,我读了一本Scala的书,但书中没有太多关于产量和地图的内容

你可以使用地图:


嗯,你为什么不能用收益率呢?收益率是一个很好的方法:

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

收益率之后的东西只是一个表达式。在这种情况下,它是一个街区。收益率之后的区块与任何区块相同:你可以在其中做任何你想做的事情。然后块中的最后一个表达式就是放在最终集合中的东西。

wait..在一个map函数中可以有两个参数吗?我认为应该是files.map{f=>printlnf.getAbsolutePath;runf}但可能提供的语法是等效的,但显然很混乱。@windlener-只有一个参数f。主体是println语句,后跟run应用程序,并返回该值。“无可否认,在投影中放置效果是非常难看的。”ErikAllik说,所以基本上是将文件中的每个元素映射到两个函数。如果我可以问的话,map是否总是映射到每个元素?如果你只想映射到一些具有特定条件的变量,那该怎么办?@windlimenter:不,它只是一个lambda,在它的主体中有两个表达式,而不是两个lambda。顺便说一句,通常认为使用带有不可变列表的var(你:+=to)比使用带有可变数据结构的val更安全,而且通常更安全。另外,val companyList=ListBuffer.empty[Int,Doc]我认为比重复两次ListBuffer部分要好。此外,如果必须使用可变数据结构,请确保在将其返回给调用方之前将其转换为不可变数据结构:companyList.toList,或者至少转换为Seq,以便调用方不会看到可变的返回类型。我不知道我可以在yield中放入两个参数
val companyList = 
  for (f <- file.listFiles if f.getName.endsWith(".txt")) yield {
    println(f.getAbsolutePath)
    run(f)
  }