list - 如何支持 MutableList具有 MutableList 的字段
问题描述
我有一个看起来像这样的界面:
interface MyObject {
val id: String
val media: MutableList<Uri>
}
我想在媒体列表由 aMutableList<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
每次检索项目时创建一个新数据。因此,仅当您需要以额外处理为代价来节省内存时,这才是一个好主意;或者当列表与检索到的项目数相比可能很大时。
如果您希望视图可写,则可以改为 extendAbstractMutableList
并覆盖另外三个方法。(这留作练习:-)
PS。我建议初始化 media
这个对象,而不是在 getter 中创建它,因为后者会在每次调用 getter 时创建一个新视图,这很浪费。MyObjectPojo
(如果您担心为每个by lazy {…}
.