我的界面看起来是这样的:
interface MyObject {
val id: String
val media: MutableList<Uri>
}我想实现它,其中媒体列表是由MutableList<String>而不是MutableList<Uri>支持的(我需要的原因在我的长问题here中已经解释过了)。最简单的方法是:
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多个成员.有什么更好的方法来实现这一点吗?
发布于 2021-03-06 18:11:11
一种选择是扩展AbstractList,它可以很简单,如:
val media = object : AbstractList<URL>() {
override val size get() = mediaStringList.size
override fun get(index: Int) = Uri.parse(mediaStringList[index])
}这为您提供了底层mediaStringList的只读视图:对它的任何更改都会立即反映在视图中。
与大多数性能问题一样,这也是一种权衡:它本身不存储任何数据,但每次检索项目时都需要创建一个新的Uri。因此,只有在需要节省内存而牺牲额外处理的情况下,或者当列表与检索到的项的数量相比时,才是一个好主意。
如果您希望视图是可写的,则可以扩展AbstractMutableList,并重写另外三个方法。
PS。我建议将media初始化到这个对象,而不是在getter中创建它,因为getter每次调用getter时都会创建一个新视图,这是很浪费的。 (如果您担心为每个MyObjectPojo创建一个视图,您可以将它封装在by lazy {…}中,以便只在第一次需要时才创建它--代价是一些同步)。
https://stackoverflow.com/questions/66508729
复制相似问题