我有一个函数,我希望返回一系列这样的元素:
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;嗨"添加...
答案 0 :(得分:2)
Seq
是不可变的。
每次执行processTemplates :+ processTemplate
时,都会创建新的Seq,并且原始var processTemplates
不会发生变化。
你可以
1)使用map
/ fold
代替foreach
并创建无副作用的必需结果
2)对mutable.Seq
使用val processTemplates
集合并修改它,因为副作用而不推荐在scala中使用。