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