我在Scala中有一个类,它有一个方法在构造函数中提供的列表上使用foreach
顺序执行一堆计算。该类有一个字段val progress: Array[Boolean] = list.map(_ => false).toArray
。其中一些计算可能需要很长时间,所以在每个计算结束时,我在progress
到true
中设置了适当的索引。然后我可以progress
来确定我在课外的计算中的位置。
这似乎不是Scala中最好的方法(因为我使用的是可变数据结构)所以任何改进它的建议都会非常感激。
答案 0 :(得分:0)
嗯,这取决于你想要对这些信息做些什么。如果您对特定事件感兴趣(例如,50%完成或类似事件),您可以将监听器传递给您的foreach方法并要求收到通知。但如果你真的需要随时询问当前的状态,那么......好吧,如果你需要知道状态,那么你必须保持状态,没有办法解决这个问题:)
一些布尔值似乎是一种矫枉过正(你可以保留当前的索引),但你提到你还计划保留其他信息,所以看起来很合理。
答案 1 :(得分:0)
我认为你的做法不好。另一种方法是使用var progress: List[Boolean]
作为不可变数据结构,并具有该变量指向的一长列不可变列表。你没有真正获得任何东西,你失去了在一步中保留你需要的确切内存的能力,而内存分配会使速度变慢。
存在可变数据结构存在的原因,这是因为它们非常有用且非常需要,与您仍然可以定义var
而非val
的原因相同,重要的不是那个一个是"坏"而另一个好的",这是一个知道何时可以使用val并牺牲可变性以换取安全性的问题。在你的例子中,你不能。
旁注:而不是使用
val progress: Array[Boolean] = list.map(_ => false).toArray
这更加清晰和快速恕我直言:
val progress = Array.fill(list.size)(false)