Scala返回空列表

时间:2017-07-04 09:37:36

标签: scala

我有一个函数,我希望返回一系列这样的元素:

def getProcessPrerequisites(processTemplateId: Int): Seq[ProcessTemplatesModel] =  {
    var processTemplates: Seq[ProcessTemplatesModel] = Seq()
    //Other function calls...

            processTemplateIds.foreach(processTemplateId => processTemplateDTO.getProcessTemplate(processTemplateId).map {
              case Some(processTemplate) => processTemplates = processTemplates :+ processTemplate
                println("List in foreach: " + processTemplates)
              case None => println("Process template not found: " + processTemplateId)
              case _ => println("Something went wrong processTemplateDTO.getProcessTemplate(" + processTemplateId + ")!")
            })

    println("List in the end: " + processTemplates)
    processTemplates
  }

最后,我遍历一个processTemplateIds列表以获取相应的元素。但是,scala决定(可能是由于它的异步性质)最终返回一个空列表。 foreach中的println:

println("List in foreach: " + processTemplates)

显示该列表不为空且已正确填充。问题是,它发生在这个println之后:

println("List in the end: " + processTemplates)

是空的。 如何确保列表不为空或等待列表填写?难道我做错了什么?谢谢!

更新

var test = ""
    processPrerequisitesDTO.getProcessPrerequisites(processTemplateId).map {
      processPrerequisiteIds => {
        test += " hello "
        processPrerequisiteIds.foreach(processTemplateId => processTemplateDTO.getProcessTemplate(processTemplateId).map {
          case Some(processTemplate) => processTemplates += processTemplate
            test += " hi "
        })
        println("FirstPrint: " + test)
      }
    }
    println("SecondPrint: " + test)

" FirstPrint"说" ha" " SecondPrint"是空的。这与范围有关吗?我没有得到它,甚至连#34;嗨"添加...

1 个答案:

答案 0 :(得分:2)

Scala中的

Seq是不可变的。 每次执行processTemplates :+ processTemplate时,都会创建新的Seq,并且原始var processTemplates不会发生变化。 你可以

1)使用map / fold代替foreach并创建无副作用的必需结果

2)对mutable.Seq使用val processTemplates集合并修改它,因为副作用而不推荐在scala中使用。