如何使用可变<Uri>列表支持可变列表<String>字段



我有一个看起来像这样的界面:

interface MyObject {
val id: String
val media: MutableList<Uri>
}

我想在媒体列表由MutableList<String>而不是MutableList<Uri>支持的情况下实现它(我需要这样做的原因在我的长问题中有解释)。简单的方法是:

data class MyObjectPojo(
override val id: String,
val mediaStringList: MutableList<String>
) : Tale {
override val media: MutableList<Uri>
get() = mediaStringList.map { Uri.parse(it) } as MutableList<Uri>
}

但它显然是低效的(例如,为了只获得第一个元素,映射操作将对整个列表运行)。我想过get() = object : MutableList<Uri> {...},但我意识到我必须实现超过20个成员…有更好的方法来实现这一点吗?

一种选择是扩展AbstractList,可以简单地如下:

val media = object : AbstractList<URL>() {
override val size get() = mediaStringList.size
override fun get(index: Int) = Uri.parse(mediaStringList[index])
}

这给了你一个底层mediaStringList的只读视图:对它的任何更改都会立即反映在视图中。

像大多数性能问题一样,这是一种权衡:它本身不存储任何数据,但每次检索项时都需要创建一个新的Uri。因此,只有当您需要以额外处理为代价来节省内存时,这才是一个好主意;或者当列表与检索的项目数量相比可能很大时。

如果您希望视图是可写的,您可以扩展AbstractMutableList,并覆盖另外三个方法。(留作练习:-)

p。我建议初始化media到这个对象,而不是在getter中创建它,因为后者将在每次调用getter时创建一个新视图,这是浪费的。(如果你担心为每个MyObjectPojo创建一个视图,你可以把它包装在by lazy {…}中,这样它只会在第一次需要的时候被创建——以一些同步为代价。)

最新更新