可以延迟修改Scala中Array中的元素吗?

时间:2017-11-17 04:53:10

标签: scala

我想定义一个数组,数组的每个元素都是从文件系统中的某个路径读取的数据集,因为数据读取成本高,并且要访问的数组中的位置稀疏,所以我想使用Lazy修饰符,以实现在访问之前不会读取一个数据集。如何定义这种数组?

2 个答案:

答案 0 :(得分:1)

是的,我们可以使用视图功能定义它。

而不是(0 to 10).toArray

scala> val a=(0 to 10).toArray
a: Array[Int] = Array(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10)

View无法实例化数组,但是当我们调用时,它只会执行

val a=(0 to 10).view
a: scala.collection.SeqView[Int,scala.collection.immutable.IndexedSeq[Int]] = SeqView(...)

scala> for (x <- a ){
     | println(x)}
0
1
2
3
4
5
6
7
8
9
10

我希望这能回答你的问题

答案 1 :(得分:0)

不,你不能在数组上使用lazy来使元素变得懒惰。最自然的事情是使用像ScalaCache这样的缓存库。

您还可以根据评论中的建议创建一个包含惰性字段的包装类。但是,我不希望将缓存暴露给数组的客户端。您应该只需编写myArray(index)来访问元素。

如果您不想使用库,这是另一个选项(没有lazy),它为您提供了一个类似于缓存的对象数组:

class CachingArray[A](size: Int, getElement: Int => A) {

  val elements = scala.collection.mutable.Map[Int, A]()

  def apply(index: Int) = elements.getOrElseUpdate(index, getElement(index))

}

只需使用大小和函数来初始化它,该函数计算给定索引处的元素。

如果您愿意,可以将其扩展IndexedSeq[A],以便它可以更像真实数组使用。只需像这样实施length

override def length: Int = size